2010-05-13 18 views
27

w3schools nói rằng ngoại lệ có thể là chuỗi, số nguyên, booleans hoặc đối tượng, nhưng ví dụ được đưa ra không tấn công tôi như thực hành tốt, vì kiểm tra loại ngoại lệ được thực hiện thông qua so sánh chuỗi. Đây có phải là phương pháp xử lý ngoại lệ ưu tiên trong JavaScript không? Có các loại ngoại lệ tích hợp (như NullPointerException) không? (nếu có, họ là gì, họ sẽ sử dụng loại thừa kế nào, và họ có ưa thích hơn các lựa chọn khác không?)Thực tiễn tiêu chuẩn để ném ngoại lệ JavaScript là gì?

+2

Bạn có thể thấy câu hỏi SO này hữu ích: http://stackoverflow.com/questions/783818/how-do-i-create-a-custom-error-in-javascript – Adam

Trả lời

10

Trường hợp ngoại lệ có thể là bất kỳ thứ gì bạn thích.

Trong các ngôn ngữ khác, trường hợp ngoại lệ phải là trường hợp và sau đó tuyên bố catch chọn ngoại lệ nào để bắt và loại bỏ ngoại lệ nào cho lớp học của cá thể đó. Tuy nhiên,

JavaScript không có tính năng này. Bạn chỉ có thể bắt được tất cả các trường hợp ngoại lệ và sau đó xem xét giá trị để quyết định phải làm gì với nó. Nếu bạn không muốn xử lý một ngoại lệ, bạn phải ném lại giá trị bị bắt theo cách thủ công. (Điều này chắc chắn làm cho các tuyên bố catch khá lộn xộn.)

Bạn có thể quyết định triển khai ngoại lệ của mình làm đối tượng và so sánh chúng với instanceof. Hoặc bạn có thể có các giá trị mờ đục duy nhất để so sánh. Hoặc bạn thậm chí có thể ném thẳng chuỗi hoặc số nếu bạn thực sự muốn.

Có các loại ngoại lệ được tích hợp sẵn (như NullPointerException) không?

Loại. ECMAScript định nghĩa một số lớp lỗi chuẩn: Error và các loại con của nó EvalError, RangeError, ReferenceError, SyntaxError, TypeError, URIError. Tuy nhiên, có các vấn đề về triển khai trình duyệt, ví dụ: try { nonexistentvar; } cấp cho TypeError trong IE thay vì ReferenceError. Và có rất nhiều ngoại lệ dành riêng cho trình duyệt khác, đặc biệt khi giao dịch với DOM.

Nó không phải là truyền thống để sử dụng các đối tượng này trực tiếp, và cố gắng phân lớp chúng là lộn xộn (vì JavaScript không có hệ thống lớp như vậy).Bạn có xu hướng gắn bó với các ngoại lệ được xác định của riêng bạn để sử dụng ứng dụng của riêng bạn thay thế. Các ngoại lệ không được sử dụng rộng rãi trong JavaScript.

2

Bạn có thể thử Dean Edwards 'Base project. Nó mô phỏng thừa kế lớp trong javascript, vì vậy việc sử dụng nó sẽ cho phép bạn phân lớp kiểu Lỗi. Bạn không thể bắt các loại lỗi khác nhau trong javascript (vì đây không phải là ngôn ngữ được nhập mạnh), nhưng bạn có thể xác định loại Lỗi đã được ném và thêm logic cho loại cụ thể đó, như vậy:

try { 

    // do something 

} catch (e) { 

    if (e instanceof NullPointerError) { 

    // handle nullpointer exception 

    } else if (e instanceof RuntimeError) { 

    // handle runtime exception 

    } else { 

    // regular exception 

    } 
} 

Tất nhiên trong đoạn mã này, tôi cho rằng bạn đã khai báo các lớp NullPointerError và RuntimeError là các lớp con của Lỗi.

4

Mục 15.11 của ECMA-262 specification xác định một số loại Error loại được "ném như ngoại lệ khi lỗi thời gian chạy xảy ra ... [chúng] cũng có thể làm đối tượng cơ sở cho các lớp ngoại lệ do người dùng xác định." Thông số đó cũng xác định six other error types là một phần của ngôn ngữ.

Có vẻ như thích hợp hơn khi ném ngoại lệ của các loại này (hoặc các kiểu bắt nguồn từ chúng) vì việc xác định loại của chúng dễ dàng hơn; họ cũng có một thông điệp tích hợp.

Theo kinh nghiệm của riêng tôi, các khối thử/nắm bắt hơi hiếm và cảm thấy thực sự đặc biệt như trái ngược với việc không thể tránh khỏi như trong Java.

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