Ném ngoại lệ trong JavaScript
Trong các bài học trước, chúng ta đã nghiên cứu hai nơi mà JavaScript ném ra ngoại lệ trong trường hợp có vấn đề nào đó.
Tuy nhiên, trong dự án của bạn, cũng có thể có những tình huống khác mà đối với bạn là ngoại lệ, nhưng đối với JavaScript thì không. Trong trường hợp đó, chúng ta có thể tạo và ném ra các ngoại lệ tùy chỉnh của riêng mình.
Hãy cùng phân tích cú pháp cần thiết cho
việc này. Đầu tiên, cần tạo một ngoại lệ
bằng lệnh new Error, truyền văn bản ngoại lệ
làm tham số:
new Error('văn bản ngoại lệ');
Sau đó, ngoại lệ này cần được ném ra bằng
lệnh throw:
throw new Error('văn bản ngoại lệ');
Việc ném một ngoại lệ buộc JavaScript
coi rằng đã xảy ra một tình huống đặc biệt.
Điều này có nghĩa là ngoại lệ như vậy có thể được bắt
bằng cấu trúc try-catch và
xử lý theo cách cần thiết.
Hãy cùng xem một ví dụ về cách sử dụng điều này. Giả sử chúng ta có một hàm chia một số cho một số khác:
function div(a, b) {
return a / b;
}
Chúng ta hãy coi rằng phép chia cho số không
là bị cấm và khi cố gắng thực hiện điều đó thì phải
xảy ra một tình huống ngoại lệ. Để làm điều này,
chúng ta sẽ kiểm tra trong hàm xem có cố gắng
chia cho 0 hay không. Nếu không - chúng ta sẽ chia,
còn nếu có - chúng ta sẽ ném ra một ngoại lệ:
function div(a, b) {
if (b !== 0) {
return a / b;
} else {
throw new Error('lỗi chia cho số không');
}
}
Trước tiên, chúng ta hãy thử chia
cho 0, mà không bắt ngoại lệ:
alert( div(3, 0) );
Trong trường hợp này, việc thực thi script sẽ bị gián đoạn
và trong console sẽ xuất hiện lỗi với văn bản 'lỗi
chia cho số không' (hãy kiểm tra). Bây giờ chúng ta
sẽ bắt lỗi của mình và
xử lý nó theo cách nào đó:
try {
alert( div(3, 0) );
} catch (error) {
alert('bạn đang cố gắng chia cho 0, điều này bị cấm');
}
Trong JavaScript, việc cố gắng lấy căn bậc hai của một số âm không dẫn đến việc ném ra ngoại lệ:
let result = Math.sqrt(-1);
console.log(result); // sẽ hiển thị NaN
Hãy viết hàm của riêng bạn để lấy căn bậc hai của một số và đồng thời ném ra ngoại lệ, nếu căn bậc hai được lấy từ một số âm.