post-image

Câu lệnh try…catch…finally trong JavaScript

Ngoại lệ

Trong bài viết này, bạn sẽ tìm hiểu về câu lệnh try…catch…finally để xử lý ngoại lệ trong JavaScript thông qua các ví dụ dưới đây.

Trước khi tìm hiểu về cách xử lý ngoại lệ trong JavaScript thì bạn cần biết ngoại lệ là gì trong lập trình.


Ngoại lệ là gì?

Ngoại lệ (exception) là từ viết tắt của "sự kiện ngoại lệ - exceptional event".

Định nghĩa: Ngoại lệ là một sự kiện xảy ra trong quá trình thực thi chương trình, làm gián đoạn dòng chảy bình thường của các chỉ thị trong chương trình.

Các loại lỗi trong lập trình

Trong lập trình, có thể có hai loại lỗi trong mã code:

Syntax Error: Lỗi cú pháp. Ví dụ: nếu bạn viết consol.log('Hello World!'); chương trình trên sẽ ném ra một lỗi cú pháp. Cụ thể lỗi trong chương trình trên là lỗi chính tả (Đáng lẽ phải là console.log).

Runtime Error: Lỗi thời gian chạy. Loại lỗi này xảy ra trong quá trình thực thi chương trình. Ví dụ, gọi một hàm hoặc một biến không hợp lệ.

Những lỗi xảy ra trong thời gian chạy được gọi là ngoại lệ. Bây giờ, các bạn hãy xem 1 số cách có thể xử lý những ngoại lệ này.


Câu lệnh try…catch

Câu lệnh try...catch được sử dụng để xử lý các ngoại lệ. Cú pháp của nó là:

try {
    // khối try
} 
catch (error) {
    // khối catch
}

Đoạn mã chính nằm bên trong khối try. Trong khi thực hiện khối try, nếu có lỗi xảy ra, nó sẽ chuyển đến khối catch. Khối catch xử lý các lỗi theo các đoạn mã được cài đặt bên trong khối.

Nếu không có lỗi xảy ra, mã bên trong khối try được thực thi và khối catch sẽ bị bỏ qua.

Ví dụ 1: Hiển thị biến không khai báo

const numerator = 100, denominator = 'a';

try {
    console.log(numerator/denominator);
    // Chưa khai báo biến a
    console.log(a);
}
catch (error) {
    console.log('Lỗi đã được bắt!'); 
    console.log('Thông báo lỗi: ' + error);  
}

Output

NaN
Lỗi đã được bắt!
Thông báo lỗi: ReferenceError: a is not defined

Trong chương trình trên, một biến không được khai báo. Khi bạn cố gắng in biến đó ra màn hình, chương trình sẽ xuất hiện lỗi. Lỗi đó được bắt bởi khối catch.


Câu lệnh try…catch…finally

Bạn cũng có thể sử dụng câu lệnh try…catch…finally để xử lý các trường hợp ngoại lệ. Khối finally chắc chắn sẽ được thực thi dù chương trình chạy thành công hay có lỗi đi chăng nữa.

Cú pháp của khối try...catch...finally là:

try {
    // khối try
} 
catch (error) {
    // khối catch
}
finally {
    // mã vẫn được thực thi
}

Ví dụ 2: thử … bắt … ví dụ cuối cùng

const numerator = 100, denominator = 'a';

try {
     console.log(numerator/denominator);
     console.log(a);
}
catch (error) {
    console.log('Lỗi đã được bắt!'); 
    console.log('Thông báo lỗi: ' + error); 
}
finally {
     console.log('Đoạn mã vẫn được thực thi!');
}

Output

NaN
Lỗi đã được bắt!
Thông báo lỗi: ReferenceError: a is not defined
Đoạn mã vẫn được thực thi!

Trong chương trình trên, lỗi đã xảy ra và bị bắt bởi khối catch. Khối finally sẽ được thực thi trong mọi tình huống.

Lưu ý: Bạn cần sử dụng câu lệnh catch hoặc finally sau câu lệnh try. Nếu không, chương trình sẽ báo lỗi Uncaught SyntaxError: Missing catch or finally after try.


Câu lệnh try…catch với setTimeout

Câu lệnh try...catch sẽ không bắt được ngoại lệ nếu nó xảy ra trong đoạn mã ‘hẹn giờ’ như trong setTimeout() vậy. Ví dụ:

try {
    setTimeout(function() {
        // error in the code
    }, 3000);
} catch (e) {
  console.log( "Không hoạt động!" );
}

Câu lệnh try...catch ở trên sẽ không hoạt động vì engine đã rời khỏi cấu trúc try..catch và hàm được thực thi sau đó.

Khối try...catch phải nằm bên trong hàm đó để bắt một ngoại lệ bên trong một hàm hẹn giờ. Ví dụ:

setTimeout(function() {
    try {
        // error in the code
    } catch {
        console.log( "Lỗi đã được bắt!" );
    }
}, 3000);

Bạn cũng có thể sử dụng câu lệnh throw với câu lệnh try...catch để sử dụng các ngoại lệ do người dùng định nghĩa. Ví dụ, một số xác định chia cho 0. Nếu bạn muốn coi Infinity là một lỗi trong chương trình thì bạn có thể ném một ngoại lệ do người dùng định nghĩa bằng cách sử dụng câu lệnh throw để xử lý điều kiện đó.

Cùng đón chờ các bài hướng dẫn về ngoại lệ trong JavaScript trong các bài viết tiếp theo nhé!


Hãy tham gia nhóm Học lập trình để thảo luận thêm về các vấn đề cùng quan tâm.

Trở thành lập trình viên từ con số 0
Tags:
,

Leave a Reply

Your email address will not be published. Required fields are marked *