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, catchfinally.

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 errReferenceError 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)
    }
}
list
from [[Error Handling in JS]]
sort file.ctime asc

Resources