2010-07-17 40 views
9

Đ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

  1. làm gì
  2. ném một ngoại lệ
  3. 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?

+2

'alert()' là chống im lặng :) –

+0

Đâ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

+0

@meder - haha, 'alert' là lớn nhất trong số tất cả :) – Anurag

Trả lời

2

Xem xét khung đăng nhập phía máy khách để báo cáo lỗi, chẳng hạn như Log4js. Người ta có thể đăng nhập thông điệp (tức là, thông tin, gỡ lỗi, cảnh báo, lỗi) trong trình duyệt hoặc vẫn tồn tại các tin nhắn đến máy chủ thông qua Ajax, tùy thuộc vào ứng dụng.

Trang web Log4js cũng cung cấp list of other JavaScript logging frameworks.

Cách tiếp cận tốt, sử dụng ví dụ ngoại lệ tùy chỉnh của bạn, sẽ là ném ngoại lệ và ghi lại lỗi khi bạn thấy phù hợp.

2

Một thiếu sót so với cách tiếp cận trên là kể từ khi khẳng định là chung, chúng ta mất đi khả năng ném ngoại lệ tùy chỉnh

Không nhất thiết:

function assert(value,message,Exctype) { 
    if(value !== true) throw new Exctype(message); 
} 

Constructors là chức năng. Hàm là giá trị lớp đầu tiên. Cảm thấy tự do để vượt qua 'em xung quanh.

Các vấn đề liên quan