Ném ngoại lệ trong JavaScript
Hãy xem xét khối catch của nhiệm vụ với JSON sản phẩm:
catch (error) {
if (error.name == 'SyntaxError') {
alert('JSON sản phẩm không hợp lệ');
} else if (error.name == 'ProductCostError') {
alert('Sản phẩm thiếu giá hoặc số lượng');
}
}
Như bạn thấy, chúng ta bắt hai ngoại lệ mà chúng ta
đã lên kế hoạch và phản ứng nào đó với chúng.
Nhưng điều gì sẽ xảy ra nếu một ngoại lệ khác loại
không được chúng ta dự tính xảy ra? Trong trường hợp này,
nó cũng sẽ rơi vào khối catch, nhưng
sẽ không có phản ứng nào cả, vì
ngoại lệ với loại khác sẽ không rơi vào
bất kỳ câu lệnh if nào của chúng ta.
Khi tôi nói rằng sẽ không có phản ứng nào, ý tôi là thực sự không có gì: thậm chí sẽ không có lỗi nào được in ra console. Mã của chúng ta sẽ đơn giản không hoạt động trong im lặng.
Do đó, có quy tắc sau: mã của bạn
chỉ nên bắt những ngoại lệ mà nó
biết cách xử lý. Nếu ngoại lệ
không được biết, thì cần phải ném nó
tiếp bằng throw. Trong trường hợp này,
phía trên nó sẽ được bắt bởi ai đó hiểu biết hơn
hoặc ngoại lệ sẽ được in ra dưới dạng lỗi trong console.
Hãy sửa mã của chúng ta:
catch (error) {
if (error.name == 'SyntaxError') {
alert('JSON sản phẩm không hợp lệ');
} else if (error.name == 'ProductCostError') {
alert('Sản phẩm thiếu giá hoặc số lượng');
} else {
throw error; // ném ngoại lệ đi xa hơn
}
}
Cho đoạn mã sau:
try {
let arr = JSON.parse(json);
for (let i = 0; i < arr.length; i++) {
localStorage.setItem(i, arr[i]);
}
} catch (error) {
if (error.name == 'QuotaExceededError') {
alert('hết dung lượng lưu trữ');
}
if (error.name == 'SyntaxError') {
alert('JSON không hợp lệ');
}
}
Có gì không ổn với mã này? Hãy sửa nó thành một phiên bản tốt hơn.