Xử lý ngoại lệ của hàm xử lý mô tả trong khối try | Laptrinhcanban.com

HOME › >>

Xử lý ngoại lệ của hàm xử lý mô tả trong khối try

Trong bài trước chúng ta đã biết cách dùng lệnh try…catch để xử lý ngoại lệ khi chạy các câu lệnh được miêu tả bên trong khối try của lệnh try…catch. Ngoài việc xử lý ngoại lệ của các câu lệnh, chúng ta cũng có thể xử lý ngoại lệ tương tự nếu như một hàm số được sử dụng thay cho các câu lệnh ở bên trong khối try.

Xử lý ngoại lệ khi lỗi xảy ra bên trong lệnh try…catch

Ở bài try…catch trong JavaScript chúng ta đã biết cách dùng cú pháp sau đây để xử lý ngoại lệ trong JavaScript:

try{
    //Các câu lệnh cần chạy
    ・・・
} catch(e) {
    //Các xử lý khi chạy code trên bị lỗi
    ・・・
}

Một cách tương tự, chúng ta cũng có thể xử lý ngoại lệ nếu như một hàm được sử dụng bên trong khối try như sau:

function func(){
//
}

try{
    func();
} catch(e) {
    //Các xử lý khi chạy code trên bị lỗi
    ・・・
}

Ví dụ cụ thể, chúng ta có mã lệnh sau:

function sum(a, b){
let sum;
sum = a + b;

return sum;
}

console.log('Start');

try{
console.log(sum(10, 8));
console.log(sum(10, 8n));
} catch(e) {
console.error(e);
}

console.log('End');

Với mã lệnh này, khi ngoại lệ xảy ra đối với hàm sum() được sử dụng trong khối try, thì chúng cũng sẽ được bắt và được xử lý bằng các lệnh mô tả trong khối catch như sau:

Start
18
TypeError: Cannot mix BigInt and other types, use explicit conversions
End

Tương tự, nếu có nhiều hàm khác nhau được sử dụng trong khối try như ví dụ sau:

function sumB(a, b){
let sum;
sum = a + b;

return sum;
}

function sumA(a, b){
return sumB(a, b);
}

console.log('Start');

try{
console.log(sumA(10, 8));
console.log(sumA(10, 8n));
} catch(e) {
console.error(e);
}

console.log('End');

Thì chúng cũng sẽ được bắt xử lý ngoại lệ bằng khối catch như sau:

Start
18
TypeError: Cannot mix BigInt and other types, use explicit conversions
End

Xử lý ngoại lệ bên trong hàm callback

Như Kiyoshi đã giải thích ở phần trên, thì ngoại lệ sẽ được bắt tại hàm nơi mà nó được gọi. Tuy nhiên chúng ta cần chú ý điều này không còn đúng, nếu như một xử lý ngoại lệ xảy ra khi một hàm callback được gọi, nhằm thực hiện một xử lý bất đồng bộ trong JavaScript.

Hãy cùng xem ví dụ dưới đây. Bên trong hàm setTimeout chúng ta đã sử dụng một hàm callback như sau:

console.log('Start');

setTimeout(function sum(a, b){
let sum = a + b;
console.log(sum);
},1000, 10, 8);

console.log('End');

Trong hàm setTimeout trên, chúng ta đã chỉ định đối số thứ hai của hàm có giá trị 1000 ms tương đương với 1 giây. Điều đó có nghĩa sau 1 giây trôi qua, hàm callback để tính tổng a và b (được chỉ định là 10 và 8) sẽ được thực thi.

Do đó sau 1 giây, kết quả xuất ra như sau:

Start
End

18

Để xử lý ngoại lệ hàm trên, chúng ta viết lệnh try catch như thông thường sau đây:

console.log('Start');

try{
setTimeout(function sum(a, b){
let sum = a + b;
console.log(sum);
},1000, 10, 8n);
} catch(e) {
console.log(e);
}

console.log('End');

Tuy nhiên khi chạy chương trình, ngoại lệ xảy ra trong hàm callback không thể bị bắt bởi câu lệnh try … catch và một lỗi được xuất ra bảng điều khiển khiến chương trình đã bị dừng lại.

Điều này là do mặc dù hàm callback được mô tả bên trong khối try, tuy nhiên thực tế thì nó được gọi từ bên ngoài khối try, nên nó không thể bị bắt ngoại lệ khi lỗi xảy ra.

Do đó, chúng ta cần chú ý rằng một hàm callback sẽ không thể xử lý ngoại lệ khi lỗi xảy ra.

Tổng kết

Trên đây Kiyoshi đã hướng dẫn bạn cách xử lý ngoại lệ của hàm xử lý mô tả trong khối try rồi. Để nắm rõ nội dung bài học hơn, bạn hãy thực hành viết lại các ví dụ của ngày hôm nay nhé.

Và hãy cùng tìm hiểu những kiến thức sâu hơn về JavaScript trong các bài học tiếp theo.

URL Link

https://laptrinhcanban.com/javascript/javascript-co-ban-den-nang-cao/xu-ly-ngoai-le-trong-javascript/xu-ly-ngoai-le-cua-ham-xu-ly-mo-ta-trong-khoi-try/

Hãy chia sẻ và cùng lan tỏa kiến thức lập trình Nhật Bản tại Việt Nam!

HOME  › >>

Profile
きよしです!笑

Tác giả : Kiyoshi (Chis Thanh)

Kiyoshi là một cựu du học sinh tại Nhật Bản. Sau khi tốt nghiệp đại học Toyama năm 2017, Kiyoshi hiện đang làm BrSE tại Tokyo, Nhật Bản.