Tôi tin rằng phần lớn lý do try..catch
hiếm gặp trong JavaScript là do ngôn ngữ có khả năng chịu lỗi khá cao. Phần lớn các tình huống có thể được xử lý bằng cách sử dụng kiểm tra mã, mặc định tốt và các sự kiện không đồng bộ. Trong một số trường hợp, chỉ cần sử dụng một mẫu sẽ ngăn chặn các vấn đề:
function Foo() {
//this may or may not be called as a constructor!!
//could accidentally overwrite properties on window
}
function Bar() {
if (!(this instanceof Bar)) {
return new Bar();
}
//this will only work on Bar objects, and wont impact window
}
Một số vấn đề chính trong các ngôn ngữ khác khiến ngoại lệ xảy ra chỉ đơn giản là không tồn tại trong JS. Kiểu đúc không cần thiết trong phần lớn thời gian. Thay vào đó, phương thức ưa thích thường là kiểm tra tính năng (thực thi một giao diện cụ thể):
function doFoo(arg) {
if (arg.foo) {
arg.foo();
} else {
Bar.prototype.foo.call(arg);
}
}
Với việc thêm async
/ await
vào ngôn ngữ, try..catch
ngày càng trở nên phổ biến. Hứa hẹn là hình thức không đồng bộ của try..catch
, nó có ý nghĩa mà người ta nên mong đợi:
doSomething().then(
doSomethingWithResult,
doSomethingWithError
)
thay vào đó được viết là:
try {
const result = await doSomething()
doSomethingWithResult(result)
} catch (e) {
doSomethingWithError(e)
}
While in java or *any other language* it is mandatory to have error handling...
- Không hẳn. Java, vâng, nhưng có rất nhiều ngôn ngữ không khăng khăng bắt thử (như C #).