NỘI DUNG BÀI VIẾT
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
}
Code language: JavaScript (javascript)
Đ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);
}
Code language: JavaScript (javascript)
Output
NaN
Lỗi đã được bắt!
Thông báo lỗi: ReferenceError: a is not defined
Code language: JavaScript (javascript)
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
}
Code language: JavaScript (javascript)
Ví dụ 2: try…catch…finally
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!');
}
Code language: JavaScript (javascript)
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!
Code language: JavaScript (javascript)
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!" );
}
Code language: JavaScript (javascript)
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);
Code language: JavaScript (javascript)
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.