Sử dụng đúng lỗi


155

Tôi đang sử dụng TypeScript cho một dự án lớn một cách hợp lý và đang tự hỏi tiêu chuẩn nào cho việc sử dụng Errors. Ví dụ: giả sử tôi đưa ra một chỉ mục trong giới hạn ngoại lệ trong Java:

throw new IndexOutOfBoundsException();

Câu lệnh tương đương trong TypeScript sẽ là:

throw new Error("Index Out of Bounds");

Những cách khác tôi có thể thực hiện điều này? Tiêu chuẩn được chấp nhận là gì?

Câu trả lời:


167

Ai đó đã đăng liên kết này lên MDN trong một bình luận và tôi nghĩ nó rất hữu ích . Nó mô tả những thứ như ErrorTypes rất kỹ lưỡng.

EvalError --- Tạo một thể hiện đại diện cho một lỗi xảy ra liên quan đến hàm toàn cầu eval ().

InternalError --- Tạo một cá thể biểu thị một lỗi xảy ra khi một lỗi nội bộ trong công cụ JavaScript được đưa ra. Ví dụ: "quá nhiều đệ quy".

RangeError --- Tạo một thể hiện đại diện cho một lỗi xảy ra khi một biến số hoặc tham số nằm ngoài phạm vi hợp lệ của nó.

ReferenceError --- Tạo một thể hiện đại diện cho một lỗi xảy ra khi hủy tham chiếu một tham chiếu không hợp lệ.

Cú phápError --- Tạo một cá thể biểu thị một lỗi cú pháp xảy ra trong khi phân tích cú pháp mã trong eval ().

TypeError --- Tạo một thể hiện đại diện cho một lỗi xảy ra khi một biến hoặc tham số không phải là loại hợp lệ.

URIError --- Tạo một thể hiện đại diện cho một lỗi xảy ra khi encodeURI () hoặc decodeURI () được truyền tham số không hợp lệ.


Nó dường như thiếu một loại tổng quát hơn cho đối số không hợp lệ . Không phải tất cả các đối số không hợp lệ thuộc RangeError. Bạn nên xác định loại tùy chỉnh hay chỉ throw new Error("<message>");?
anddero

58

Quy ước ngoài phạm vi trong JavaScript đang sử dụng RangeError. Để kiểm tra loại sử dụng if / other + instanceofbắt đầu từ cụ thể nhất đến chung chung nhất

try {
    throw new RangeError();
}
catch (e){
    if(e instanceof RangeError){
        console.log('out of range');
    }
}

2
Một lỗi chung thì sao? Và / hoặc danh sách các lớp lỗi JS được xây dựng ở đâu?
pitosalas 14/07/2015

7
Có một danh sách các loại lỗi JavaScript và thông tin khác tại Mozilla Developer Network: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/
trộm

6
@basarat Tôi nghĩ bạn nên thêm else { throw; }vào đây
knocte

43

Giải pháp đơn giản để phát ra và hiển thị thông báo bằng Exception.

try {
  throw new TypeError("Error message");
}
catch (e){
  console.log((<Error>e).message);//conversion to Error type
}

Thận trọng

Trên đây không phải là một giải pháp nếu chúng ta không biết loại lỗi nào có thể được phát ra từ khối. Trong những trường hợp như vậy, nên sử dụng các bộ bảo vệ và xử lý đúng cách cho lỗi thích hợp - hãy xem câu trả lời @Moriarty.


Cảm ơn con trỏ để chuyển đổi loại rõ ràng. Không tìm thấy thông tin đó trong Bản mô tả-Tài liệu và đã học được điều gì đó ngày hôm nay.
JackLeEmmerdeur

Bạn có biết mục đích của việc thêm <Error> là gì không? e.message hoạt động tốt cho tôi.
sbattou

1
@sbattou mục đích duy nhất <Error>là nói với trình biên dịch TS rằng eđây là loại <Error>để bạn có (1) intellisense và (2) kiểm tra loại tốt hơn. Mặc dù vậy, hãy lưu ý rằng bất kỳ diễn viên nào cũng không dịch sang JS và hoàn toàn là đường cú pháp.
Didii

24

Đừng quên về các câu lệnh chuyển đổi:

  • Đảm bảo xử lý với default.
  • instanceof có thể phù hợp trên siêu lớp.
  • ES6 constructorsẽ phù hợp với lớp chính xác.
  • Dễ đọc hơn.

function handleError() {
    try {
        throw new RangeError();
    }
    catch (e) {
        switch (e.constructor) {
            case Error:      return console.log('generic');
            case RangeError: return console.log('range');
            default:         return console.log('unknown');
        }
    }
}

handleError();


3
Điều đó thật tuyệt; có vẻ mạnh mẽ và sạch sẽ hơn các câu trả lời khác.
Victor Zamanian
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.