Lỗi JavaScript - Throw và Try to Catch

try Câu lệnh cho phép bạn kiểm tra lỗi trong khối mã.

catch Câu lệnh cho phép bạn xử lý lỗi.

throw Câu lệnh cho phép bạn tạo lỗi tùy chỉnh.

finally Cho phép bạn thực thi mã, sau try và catch, bất kể kết quả thế nào.

Lỗi sẽ luôn xảy ra!

Khi thực thi mã JavaScript, có thể xảy ra nhiều loại lỗi.

Lỗi có thể là lỗi mã của nhà phát triển, lỗi do đầu vào không chính xác hoặc do các vấn đề không thể dự đoán.

Mẫu

Trong ví dụ này, chúng ta thông qua alert Viết mã cảnh báo để cố ý tạo ra lỗi:

<p id="demo"></p>
<script>
try {
    alert("Chào mừng bạn đã truy cập!");
}
catch(err) {
    document.getElementById("demo").innerHTML = err.message;
}
</script>

Thử ngay

JavaScript sẽ bắt lỗi alert và thực thi mã để xử lý lỗi.

JavaScript try và catch

try Câu lệnh cho phép bạn định nghĩa một khối mã để kiểm tra lỗi khi thực thi.

catch Câu lệnh cho phép bạn định nghĩa một khối mã để thực thi, nếu có lỗi xảy ra trong khối mã try.

Câu lệnh JavaScript trycatch Xuất hiện theo cặp:

try {
     Mã kiểm tra
}
 catch(err) {
     Mã xử lý lỗi
} 

JavaScript ném lỗi

Khi xảy ra lỗi, JavaScript thường dừng lại và tạo ra thông báo lỗi.

Tên kỹ thuật được mô tả như sau:JavaScript sẽ ném lỗi (ném lỗi).

JavaScript thực sự sẽ tạo ra một đối tượng có hai thuộc tính Đối tượng Error:namemessage.

Câu lệnh throw

throw Câu lệnh cho phép bạn tạo lỗi tùy chỉnh.

Trên thực tế, bạn có thểNém lỗi (ném lỗi).

Lỗi có thể là chuỗi, số, boolean hoặc đối tượng trong JavaScript:

throw "Quá lớn";    // Ném văn bản
throw 500;          // Ném số

nếu để throwtrycatch Khi sử dụng cùng nhau, chúng có thể kiểm soát luồng chương trình và tạo thông báo lỗi tùy chỉnh.

Ví dụ xác thực đầu vào

Ví dụ này sẽ kiểm tra đầu vào. Nếu giá trị là không đúng, sẽ ném lỗi (err).

Lỗi này (err) được bắt bởi câu lệnh catch và hiển thị một thông báo lỗi tùy chỉnh:

<!DOCTYPE html>
<html>
<body>
<p>nhập số từ 5 đến 10:</p>
<input id="demo" type="text">
<button type="button" onclick="myFunction()">Kiểm tra đầu vào</button>
<p id="message"></p>
<script>
function myFunction() {
    var thông điệp, x;
    message = document.getElementById("message");
    message.innerHTML = "";
    x = document.getElementById("demo").value;
    try { 
        if(x == "") throw "Trống";
         if(isNaN(x)) throw "không phải số";
         x = Number(x);
        if(x < 5) throw "Quá nhỏ";
        if(x > 10) throw "Quá lớn";
    }
    catch(err) {
        thông điệp.innerHTML = "Nhập là " + err;
    }
}
</script>
</body>
</html> 

Thử ngay

Xác thực HTML

Mã trên chỉ là một ví dụ.

Trình duyệt hiện đại thường kết hợp JavaScript với xác thực HTML tích hợp sẵn bằng cách sử dụng các quy tắc xác thực được định nghĩa sẵn trong các thuộc tính HTML:

<input id="demo" type="number" min="5" max="10" step="1">

Bạn sẽ học thêm về việc xác thực biểu mẫu trong các chương sau của hướng dẫn này.

Câu lệnh finally

finally Câu lệnh cho phép bạn thực thi mã sau khi try và catch, không matter kết quả:

try {
     // Mã lệnh để kiểm tra
}
 catch(err) {
     // Mã lệnh xử lý lỗi
} 
finally {
     // Mã lệnh được thực thi không matter kết quả thế nào
}

Mẫu

function myFunction() {
    var thông điệp, x;
    message = document.getElementById("message");
    message.innerHTML = "";
    x = document.getElementById("demo").value;
    try { 
        if(x == "") throw "trống";
        if(isNaN(x)) throw "không phải số";
         x = Number(x);
        if(x >  10) throw "太大";
        if(x <  5) throw "太小";
    }
    catch(err) {
        message.innerHTML = "Lỗi: " + err + ".";
    }
    finally {
        document.getElementById("demo").value = "";
    }
}

Thử ngay

Đối tượng Error

JavaScript có đối tượng error内置 để cung cấp thông tin lỗi khi xảy ra lỗi.

đối tượng error cung cấp hai thuộc tính hữu ích:namemessage.

Thuộc tính đối tượng error

Thuộc tính Mô tả
name Đặt hoặc trả về tên lỗi
message Đặt hoặc trả về thông điệp lỗi (một chuỗi)

Giá trị Tên Lỗi

Thuộc tính name của error có thể trả về sáu giá trị khác nhau:

Tên lỗi Mô tả
EvalError Đã xảy ra lỗi trong hàm eval()
RangeError Đã xảy ra lỗi vượt quá phạm vi số
ReferenceError Đã xảy ra lỗi truy cập trái phép
SyntaxError Đã xảy ra lỗi ngữ pháp
TypeError Đã xảy ra lỗi loại
URIError Lỗi đã xảy ra trong encodeURI()

Dưới đây là chi tiết về sáu giá trị khác nhau này.

Lỗi Eval

EvalError thông báo lỗi trong hàm eval().

Phiên bản JavaScript mới hơn sẽ không ném bất kỳ EvalErrorVui lòng sử dụng SyntaxError thay thế.

Lỗi phạm vi

RangeError sẽ bị ném ra khi bạn sử dụng số ngoài phạm vi giá trị hợp lệ.

Ví dụ: Bạn không thể thiết lập số lượng chữ số hiệu số của số là 500.

Mẫu

var num = 1;
try {
    num.toPrecision(500);   // Số không thể có 500 số hiệu số
 }
catch(err) {
    document.getElementById("demo").innerHTML = err.name;
} 

Thử ngay

Lỗi truy cập

Nếu bạn sử dụng (truy cập) biến chưa được khai báo, thì ReferenceError sẽ bị ném ra:

Mẫu

var x;
try {
    x = y + 1;   // y không thể được truy cập (sử dụng)
 }
catch(err) {
    document.getElementById("demo").innerHTML = err.name;
} 

Thử ngay

Lỗi ngữ pháp

Nếu bạn tính toán mã có lỗi về ngữ pháp, nó sẽ SyntaxError Được ném ra:

Mẫu

try {
    eval("alert('Hello)");   // Thiếu ' sẽ gây ra lỗi
}
catch(err) {
     document.getElementById("demo").innerHTML = err.name;
} 

Thử ngay

Lỗi loại

Nếu giá trị bạn sử dụng không trong phạm vi giá trị mong đợi, thì TypeError Được ném ra:

Mẫu

var num = 1;
try {
    num.toUpperCase();   // Bạn không thể chuyển đổi số thành chữ in hoa
 }
catch(err) {
    document.getElementById("demo").innerHTML = err.name;
} 

Thử ngay

Lỗi URI

Nếu bạn sử dụng các ký tự không hợp lệ trong hàm URI, thì URIError Được ném ra:

Mẫu

try {
    decodeURI("%%%");   // Bạn không thể mã hóa URI cho các dấu percent này
 }
catch(err) {
    document.getElementById("demo").innerHTML = err.name;
} 

Thử ngay

Thuộc tính đối tượng Error không tiêu chuẩn

Mozilla và Microsoft đã định nghĩa các thuộc tính đối tượng error không tiêu chuẩn:

  • fileName (Mozilla)
  • lineNumber (Mozilla)
  • columnNumber (Mozilla)
  • stack (Mozilla)
  • description (Microsoft)
  • number (Microsoft)

Hãy không sử dụng các thuộc tính này trên các trang web công cộng. Chúng không hoạt động trên tất cả các trình duyệt.