Điều gì sẽ là cách tốt để báo cáo lỗi trong JavaScript thay vì dựa vào giá trị rỗng và không xác định khi xảy ra lỗi và chức năng không thể tiến hành. Tôi có thể nghĩ đến ba phương pháp:Kỹ thuật chống im lặng JavaScript để cho biết lỗi
- làm gì
- ném một ngoại lệ
- assert
Dưới đây là một ví dụ kịch bản rất đơn giản - một chức năng mà các khoản tín dụng một tài khoản người dùng với số tiền được thông qua vào. Hàm credit
là một phần của đối tượng Account
.
Đây là giải pháp ngây thơ.
function credit(amount) {
this.balance += amount;
}
Một vấn đề lớn với phương pháp này là dữ liệu không hợp lệ. Hãy sửa nó và sử dụng giá trị trả về để cho biết rằng thao tác thất bại.
function credit(amount) {
if(!isInt(amount)) {
return false;
}
this.balance += amount;
}
Đây là cải tiến so với phiên bản trước, nhưng mã khách hàng sẽ phải kiểm tra giá trị trả về để đảm bảo rằng thao tác đã thành công. Làm điều này cho cơ bản mọi phương pháp trong hệ thống có thể trở nên rườm rà.
if(!johnDoe.credit(100)) {
// do some error handling here
}
Cách tiếp cận thứ ba, tương tự như cách thứ hai, là ném ngoại lệ. Vì chúng tôi đang ném ngoại lệ, nên có thể ném một loại ngoại lệ cụ thể thay vì loại ngoại lệ chung.
function credit(amount) {
if(!isInt(amount)) {
throw new InvalidAmountError(amount);
}
this.balance += amount;
}
Cách tiếp cận thứ tư tương tự như ném ngoại lệ là sử dụng các xác nhận trong mã của bạn. Một thiếu sót so với cách tiếp cận trên là vì khẳng định là chung chung, chúng ta mất khả năng ném ngoại lệ tùy chỉnh. Nó vẫn có thể mặc dù bằng cách đi qua các đối tượng để ném vào mỗi cuộc gọi khẳng định.
function credit(amount) {
assert(!isInt(amount), "Amount to credit is not an integer");
this.balance += amount;
}
Chức năng toàn cầu assert
dễ viết và làm cho mã ngắn hơn một chút.
function assert(value, message) {
if(value !== true) {
throw new AssertionError(message);
}
}
function AssertionError(message) {
this.message = message;
}
AssertionError.prototype.toString = function() {
return 'AssertionError: ' + this.message;
}
Trong số các phương pháp này, cách tốt nhất để giải quyết các giá trị không mong muốn và đường dẫn không vui. Có cách tiếp cận nào khác không được đề cập ở đây có thể hữu ích không?
'alert()' là chống im lặng :) –
Đây là một trong những khía cạnh khó chịu nhất của các ngôn ngữ được nhập động. – ChaosPandion
@meder - haha, 'alert' là lớn nhất trong số tất cả :) – Anurag