Bài học theo mô-đun (4/4)
thử/bắt/ném
lỗi trong JavaScript là một giá trị (thường là đối tượng Error) làm gián đoạn luồng thông thường
và hiển thị ngăn xếp cuộc gọi cho đến khi có người nắm bắt được. Cấu trúc để xử lý trường hợp này là
try / catch.
Đưa ra lỗi: throw
function dividi(a, b) {
if (b === 0) {
throw new Error('Divisione per zero');
}
return a / b;
}throw ngay lập tức làm gián đoạn chức năng hiện tại.
Đang bắt: try / catch
try {
const r = dividi(10, 0);
console.log('ok', r);
} catch (err) {
console.log('errore:', err.message); // 'errore: Divisione per zero'
}
// Il programma continua qui, anche se c'è stato un errore.Mọi thứ bên trong try đều được thực thi; nếu xảy ra lỗi (thông qua throw hoặc bởi bất kỳ thao tác nào
không thành công), điều khiển sẽ nhảy tới khối catch. Biến sau catch (...) nhận được lỗi.
finally (tùy chọn)
Mã luôn chạy, có lỗi hay không. Hữu ích để đóng tài nguyên:
try {
// ... operazione rischiosa
} catch (err) {
// ... log
} finally {
// ... pulizia (sempre eseguita)
}Khi nào nên sử dụng nó (và khi nào không)
- Có: Thao tác I/O (
JSON.parsetrên đầu vào không đáng tin cậy,fetch, truy cập đĩa), chuyển đổi có thể thất bại. - Có thể không: đối với dòng chảy bình thường. Nếu bạn biết đầu vào có thể không hợp lệ, tốt hơn hết bạn nên kiểm tra nó
với
ifhơn là ném và bắt.
// Tipico: parsing JSON difensivo
function parseJsonSafe(text) {
try {
return { ok: true, value: JSON.parse(text) };
} catch (err) {
return { ok: false, error: err.message };
}
}
parseJsonSafe('{"a":1}'); // { ok: true, value: {a:1} }
parseJsonSafe('non json'); // { ok: false, error: '...' }Hãy thử nó
Xác định `safeDivide(a, b)`: nếu b bằng 0 sẽ đưa ra Lỗi với thông báo 'Chia cho mỗi 0', nếu không thì trả về a/b.
Hiển thị gợi ý
if (b === 0) ném Lỗi mới('...'); sau đó trả về a/b.
Giải pháp khả dụng sau 3 lần thử
Xem lại bài tập
Xác định `parseJsonSafe(text)`: nếu văn bản hợp lệ JSON trả về { ok: true, value: <object> }, nếu không thì { ok: false }. Sử dụng thử/bắt trên JSON.parse.
Hiển thị gợi ý
Gói JSON.parse vào thử; trong phần bắt return { ok: false }.
Giải pháp khả dụng sau 3 lần thử