JS là một ngôn ngữ lỏng lẻo, đôi khi chúng ta nhận được những lỗi biên dịch khi cố truy cập giá trị của biến undefined
hoặc gọi hàm undefined
, etc. JS cung cấp cơ chế kiểm soát lỗi sử dụng try
, catch
vàfinally
.
Try - Catch -finally
Đặt đoạn code có khả năng xảy ra lỗi vào bên trong khối lệnh của try
.
try {
// code that may throw an error
}
Khối lệnh của catch
để thực thi những đoạn code khi xảy ra lỗi trong khối lệnh try
. Khối lệnh này có một tham số để cho biết thông tin của lỗi.
try {
// code that may throw an error
} catch (err) {
// code to be executed if an error occurs
}
Thông thường chúng ta sẽ sử dụng khối lệnh catch
để hiển thị lỗi hoặc các thông tin đặc thù cho user.
Khối lệnh finally
sẽ được thực thi bất kể lỗi có xảy ra hay không. Khối lệnh này thường dùng để hoàn thành những yêu cầu chưa hoàn thành trong khối lệnh try
hoặc để đặt lại giá trị cho các biến.
try {
// code that may throw an error
} catch (err) {
// code to be executed if an error occurs
} finally {
// code to be executed regardless of an error occurs or not
}
Ví dụ:
try {
let lastName = "Yetayeh"
let fullName = firstName + " " + lastName
} catch (err) {
console.log(err) // ReferenceError: firstName is not defined
} finally {
console.log("In any case I will be executed") // "In any case I will be executed"
}
Có thể thay thế console.log(err)
thành console.error(err)
.
try {
let lastName = "Yetayeh"
let fullName = fistName + " " + lastName
} catch (err) {
console.error(err) // ReferenceError: firstName is not defined
} finally {
console.log("In any case I will be executed") // In any case I will be executed
}
Using err
Parameter
Tham số err
là một object có vài thuộc tính, chẳng hạn như name
hoặc message
.
Ở ví dụ trên, name
của err
là ReferenceError
và message là firstName is not defined
.
Using throw
Keyword
Câu lệnh throw
dùng để tùy chỉnh error message. Có thể truyền vào chuỗi, số, boolean hoặc thậm chí object.
Ví dụ:
const handleInputNumber = () => {
let x = prompt("Enter a number: ")
try {
if (x == "") throw "empty"
if (isNaN(x)) throw "not a number"
x = Number(x)
if (x < 5) throw "too low"
if (x > 10) throw "too high"
} catch (err) {
console.error(err)
}
}
handleInputNumber()
Ở trên, ta dùng throw để custom nội dung thông báo lỗi. Đoạn thông báo lỗi này sẽ truyền vào err
của khối lệnh catch
.
Error Types
Trong JS có các loại lỗi phổ biến như sau:
SyntaxError
Lỗi cú pháp.
let square = 2 x 2
console.log(square) // Uncaught SyntaxError: Unexpected identifier 'x'
ReferenceError
Tham chiếu trái phép, xuất hiện khi chúng ta cố truy cập biến chưa được khai báo.
let firstName = "Asabeneh"
let fullName = firstName + " " + lastName
console.log(fullName) // Uncaught ReferenceError: lastName is not defined
RangeError
Quăng lỗi khi đối số truyền vào hàm có giá trị không nằm trong phạm vi cho phép của hàm.
function check(n) {
if (!(n >= -500 && n <= 500)) {
throw new RangeError('The argument must be between -500 and 500.')
}
}
try {
check(2000)
} catch (error) {
if (error instanceof RangeError) {
// Handle the error
}
}
Chúng ta có thể xử lý lỗi dựa trên từng loại lỗi cụ thể:
try {
willGiveErrorSometime()
} catch (error) {
if (error instanceof RangeError) {
rangeErrorHandler(error)
} else if (error instanceof ReferenceError) {
referenceErrorHandle(error)
} else {
errorHandler(error)
}
}
Related
list
from [[Error Handling in JS]]
sort file.ctime asc