try...catch trong JavaScript và cách xử lý ngoại lệ | Laptrinhcanban.com

try...catch trong JavaScript và cách xử lý ngoại lệ

Cùng tìm hiểu về câu lệnh try…catch trong JavaScript. Bạn sẽ học được cách dùng try…catch để xử lý ngoại lệ trong JavaScript sau bài học này.

Xử lý ngoại lệ (Exception) là gì

Trong quá trình một chương trình đang được thực thi, nếu một lỗi xảy ra và một ngoại lệ (Exception) được đưa ra, chương trình sẽ bị huỷ ngay tại thời điểm đó nếu không có một quy trình xử lý nào được thiết lập cho ngoại lệ đó.

Ví dụ cụ thể, hãy cùng xem một chương trình sau đây:

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

console.log('Start');

let result = sum(10, 8);
console.log(result);

console.log('End');


//> Start
//> 18
//> End

Chương trình trên dùng để tính tổng 2 số truyền vào hàm. Nếu chúng ta chỉ định 2 số đó ở dạng integer như trên, chương trình sẽ không có lỗi gì xảy ra.

Tuy nhiên, điều gì sẽ xảy ra khi chúng ta thử tính tổng một số integer và một số ở dạng Long integer?

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

console.log('Start');

let result = sum(10, 8n);
console.log(result);

console.log('End');


//> Start
//> TypeError: Cannot mix BigInt and other types, use explicit conversions

Như bạn thấy, chương trình đã bị dừng và huỷ giữa lúc nó đang chạy. Lý do là bởi không thể tính tổng giữa 1 số integer và một số ở dạng Long integer được, đây là một ngoại lệ dẫn đến lỗi TypeError đã xảy ra. Và do không có thêm bất cứ xử lý gì đươc thiết lập cho ngoại lệ này, nên chương trình không thể xử lý thêm và bị dừng ở giữa chừng như trên.

Để có thể thiết lập các xử lý khi một ngoại lệ xảy ra và không làm chương trình bị dừng lại giữa chừng, chúng ta cần dùng đến lệnh try…catch mà Kiyoshi sẽ hướng dẫn dưới đây.

try…catch trong JavaScript

try…catch trong JavaScript là câu lệnh dùng để thiết lập các xử lý khi một ngoại lệ (lỗi) xảy ra. Một câu lệnh try…catch bao gồm khối try chứa lệnh cần chạy, và khối catch chứa các xử lý sẽ chạy nếu trong quá trình chạy lệnh trong khối try mà xảy ra lỗi khiến chương trình trả về một ngoại lệ.

Các xử lý được thiết lập khi ngoại lệ xảy ra sẽ giúp chương trình xử lý lỗi mà không bị dừng lại ở giữa chừng.

Cú pháp sử dụng try…catch trong JavaScript để xử lý ngoại lệ như sau:

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
    ・・・
}

Chúng ta viết các mã lệnh có khả năng xảy ra lỗi và cần xử lý ngoại lệ vào khối try, và các xử lý sẽ thực thi khi ngoại lệ xảy ra vào khối catch. Biến số e (tên tuỳ ý, có thể lược bỏ) được sử dụng để lưu giá trị của ngoại lệ mà chương trình đã trả về, và thường thì giá trị này sẽ là một Error Object. Chúng ta có thể dùng biến e này để thao tác và xử lý ngoại lệ được trả về, với các xử lý ngoại lệ được miêu tả bên trong khối catch.

Ví dụ cụ thể, chúng ta có thể bắt và xử lý ngoại lệ trong chương trình tính tổng ở trên như sau:

function sum(a, b){
let sum;
try{
sum = a + b;
} catch(e) {
console.log(e);
return null;
}

return sum;
}

console.log('Start');

console.log(sum(10, 8n));

console.log(sum(10, 8));

console.log('End');

Kết quả:

Start
TypeError: Cannot mix BigInt and other types, use explicit conversions
at sum (<anonymous>:4:13)
at <anonymous>:15:13
null
18
End
undefined

Chúng ta đã thêm xử lý xuất ra màn hình nội dung ngoại lệ (lỗi) cùng với xử lý trả về null vào bên trong khối catch. Do đó, khi tiến hành cộng 108n thì ngoại lệ đã được xử lý mà không làm chương trình bị dừng giữa chừng, nên các xử lý sau đó cũng sẽ được chạy và in kết quả ra màn hình như trên.

try…catch…finally trong JavaScript

Ngoài cách dùng try…catch để xử lý ngoại lệ thì chúng ta cũng có thể sử dụng câu lệnh try…catch…finally để giúp xử lý ngoại lệ trở nên linh hoạt hơn.

try…catch…finally trong JavaScript là câu lệnh dùng để thiết lập các xử lý khi một ngoại lệ (lỗi) xảy ra. Tuy nhiên khác với lệnh try…catch thông thường thì lệnh này sẽ luôn luôn thực hiện cuối cùng các xử lý được mô tả trong khối finally bất kể có xảy ra ngoại lệ hay không.

Cú pháp sử dụng try…catch…finally trong JavaScript để xử lý ngoại lệ như sau:

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
    ・・・
} finally {
    //Các xử lý sẽ chạy cuối cùng
    ・・・

Do cách lệnh mô tả trong khối finally sẽ luôn được thực thi cuối cùng bất kể có xảy ra ngoại lệ hay không, nên nó sẽ được thực thi sau khi các lệnh trong khối try chạy xong, hoặc sau khi các lệnh trong khối catch (nếu lỗi xảy ra) được thực thi. Lưu ý, nó luôn được thực thi cuối cùng, bất kể chúng ta có sử dụng các lệnh dừng hay thoát chương trình như return, break hay continue trong các khối try và khối catch.

Bởi vậy, lệnh try…catch…finally hay được sử dụng trong các xử lý cần có lệnh đóng lại chương trình, ví dụ như khi chúng ta mở một file và cần đóng nó lại, hoặc chương trình kết nối database cần ngắt kết nối sau đó.

Sau đây là ví dụ đơn giản để kiểm tra câu lệnh này.

function sum(a, b){
let sum;
try{
sum = a + b;
} catch(e) {
console.error(e);
return null;
} finally {
console.log('Finally!');
}

return sum;
}

console.log('Start');

console.log(sum(10, 8));
console.log(sum(10, 8n));

console.log('End');

//> Start
//> Finally!
//> 18
//> TypeError: Cannot mix BigInt and other types, use explicit conversions
//> Finally!
//> null
//> End

Với mã lệnh trên, bất kể hàm sum có xảy ra lỗi và trả về ngoại lệ hay không, thì lệnh in trong khối Finally đều luôn được thực thi cuối cùng, và xuất ra kết quả như trên.

Tổng kết

Trên đây Kiyoshi đã hướng dẫn bạn cách xử lý ngoại lệ bằng try…catch trong JavaScript 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.

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.