HomeLập trìnhJavaScriptTry/Catch trong JavaScript...

Try/Catch trong JavaScript – Cách xử lý lỗi trong JS


Lỗi và lỗi là không thể tránh khỏi trong lập trình. Một người bạn của tôi gọi họ tính năng chưa biết :).

Bạn muốn gọi chúng là gì cũng được, nhưng tôi thành thật tin rằng lỗi là một trong những điều khiến công việc lập trình viên của chúng ta trở nên thú vị.

Ý tôi là cho dù bạn có thể cố gắng gỡ lỗi một số mã qua đêm đến mức nào, tôi khá chắc chắn rằng bạn sẽ cười sảng khoái khi phát hiện ra rằng vấn đề chỉ là một dấu phẩy đơn giản mà bạn đã bỏ qua hoặc đại loại như thế. Mặc dù vậy, một lỗi do khách hàng báo cáo sẽ khiến họ cau mày hơn là mỉm cười.

Điều đó nói rằng, lỗi có thể gây khó chịu và một nỗi đau thực sự ở phía sau. Đó là lý do tại sao trong bài viết này, tôi muốn giải thích một thứ gọi là cố gắng bắt trong JavaScript.

Khối thử/bắt trong JavaScript là gì?

Một cố gắng bắt khối về cơ bản được sử dụng để xử lý lỗi trong JavaScript. Bạn sử dụng điều này khi bạn không muốn có lỗi trong tập lệnh làm hỏng mã của mình.

Mặc dù điều này có vẻ giống như một việc bạn có thể dễ dàng thực hiện với một câu lệnh iftry/catch mang lại cho bạn rất nhiều lợi ích ngoài những gì câu lệnh if/else có thể làm, một số lợi ích bạn sẽ thấy bên dưới.

try{
//...
}catch(e){
//...
}

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

Câu lệnh bắt cho phép bạn xử lý lỗi đó. Ví dụ:

try{ 
getData() // getData is not defined 
}catch(e){
alert(e)
}

Về cơ bản, đây là cách thử/bắt được xây dựng. Bạn đặt mã của bạn trong thử chặnvà ngay lập tức nếu có lỗi, JavaScript sẽ đưa ra nắm lấy kiểm soát câu lệnh và nó chỉ làm bất cứ điều gì bạn nói. Trong trường hợp này, nó sẽ cảnh báo bạn về lỗi.

Tất cả các lỗi JavaScript thực sự là các đối tượng chứa hai thuộc tính: tên (ví dụ: Lỗi, lỗi cú pháp, v.v.) và thông báo lỗi thực sự. Đó là lý do tại sao khi chúng ta cảnh báo echúng tôi nhận được một cái gì đó như ReferenceError: getData không được xác định.

Giống như mọi đối tượng khác trong JavaScript, bạn có thể quyết định truy cập các giá trị khác nhau, ví dụ: e.name(ReferenceError) và e.message(getData không được xác định).

Nhưng thành thật mà nói, điều này không thực sự khác với những gì JavaScript sẽ làm. Mặc dù JavaScript sẽ tôn trọng bạn đủ để ghi lỗi vào bảng điều khiển và không hiển thị cảnh báo cho cả thế giới thấy :).

Đọc thêm  Cách sử dụng các hàm gọi, áp dụng và liên kết trong JavaScript – với các ví dụ về mã

Vậy lợi ích của câu lệnh try/catch là gì?

Cách sử dụng câu lệnh try/catch

Các throw Bản tường trình

Một trong những lợi ích của thử/bắt là khả năng hiển thị lỗi do bạn tạo tùy chỉnh. cái này gọi là (throw error).

Trong những tình huống mà bạn không muốn thứ xấu xí này mà JavaScript hiển thị, bạn có thể đưa ra lỗi của mình (một ngoại lệ) bằng cách sử dụng tuyên bố ném. Lỗi này có thể là một chuỗi, boolean hoặc đối tượng. Và nếu có lỗi, câu lệnh bắt sẽ hiển thị lỗi mà bạn đưa ra.

let num =prompt("insert a number greater than 30 but less than 40")
try { 
if(isNaN(num)) throw "Not a number (☉。☉)!" 
else if (num>40) throw "Did you even read the instructions ಠ︵ಠ, less than 40"
else if (num <= 30) throw "Greater than 30 (ب_ب)" 
}catch(e){
alert(e) 
}

Điều này là tốt đẹp, phải không? Nhưng chúng ta có thể tiến thêm một bước bằng cách thực sự đưa ra một lỗi với các lỗi của hàm tạo JavaScript.

Về cơ bản JavaScript phân loại lỗi thành sáu nhóm:

  • Đánh giáLỗi – Đã xảy ra lỗi trong hàm eval.
  • phạm vi lỗi – Một số nằm ngoài phạm vi đã xảy ra, ví dụ 1.toPrecision(500). toPrecision về cơ bản cung cấp cho các số một giá trị thập phân, ví dụ 1.000 và một số không thể có 500 giá trị đó.
  • Tham khảoLỗi – Sử dụng biến chưa khai báo
  • lỗi cú pháp – Khi đánh giá mã có lỗi cú pháp
  • LoạiLỗi – Nếu bạn sử dụng một giá trị nằm ngoài phạm vi của các loại dự kiến: ví dụ: 1.toUpperCase()
  • Lỗi URI (Mã định danh tài nguyên thống nhất) – Một URIError được đưa ra nếu bạn sử dụng các ký tự không hợp lệ trong một hàm URI.

Vì vậy, với tất cả những điều này, chúng ta có thể dễ dàng đưa ra một lỗi như throw new Error("Hi there"). Trong trường hợp này, tên của lỗi sẽ là Lỗi và tin nhắn Chào bạn. Bạn thậm chí có thể tiếp tục và tạo hàm tạo lỗi tùy chỉnh của riêng mình, ví dụ:

function CustomError(message){ 
this.value ="customError";
this.message=message;
}

Và bạn có thể dễ dàng sử dụng nó ở bất cứ đâu với throw new CustomError("data is not defined").

Cho đến nay, chúng ta đã học về try/catch và cách nó ngăn chặn kịch bản của chúng ta chết, nhưng điều đó thực sự phụ thuộc. Hãy xem xét ví dụ này:

try{ 
console.log({{}}) 
}catch(e){ 
alert(e.message) 
} 
console.log("This should run after the logged details")

Nhưng khi bạn dùng thử, ngay cả với câu lệnh thử, nó vẫn không hoạt động. Điều này là do có hai loại lỗi chính trong JavaScript (những gì tôi đã mô tả ở trên –syntaxError, v.v. – không thực sự là loại lỗi. Bạn có thể gọi chúng là ví dụ về lỗi): lỗi thời gian phân tích cú pháplỗi thời gian chạy hoặc ngoại lệ.

Đọc thêm  Ba cách đặt tiêu đề cho một câu trong JavaScript

Lỗi thời gian phân tích cú pháp là những lỗi xảy ra bên trong mã, về cơ bản là do động cơ không hiểu mã.

Ví dụ, ở trên, JavaScript không hiểu ý của bạn là gì {{}}và do đó, try / catch của bạn không có tác dụng ở đây (nó sẽ không hoạt động).

Mặt khác, lỗi thời gian chạy là những lỗi xảy ra trong mã hợp lệ và đây là những lỗi mà try/catch chắc chắn sẽ tìm thấy.

try{ 
y=x+7 
} catch(e){ 
alert("x is not defined")
} 
alert("No need to worry, try catch will handle this to prevent your code from breaking")

Dù bạn có tin hay không thì tùy, đoạn mã trên là hợp lệ và lệnh try/catch sẽ xử lý lỗi một cách thích hợp.

Các Finally bản tường trình

Các cuối cùng tuyên bố đóng vai trò như điểm trung lập, điểm cơ sở hoặc điểm cuối cùng cho khối thử/bắt của bạn. Với cuối cùng, về cơ bản bạn đang nói bất kể điều gì xảy ra trong lần thử/bắt (lỗi hoặc không có lỗi), mã này trong câu lệnh cuối cùng sẽ chạy. Ví dụ:

let data=prompt("name")
try{ 
if(data==="") throw new Error("data is empty") 
else alert(`Hi ${data} how do you do today`) 
} catch(e){ 
alert(e) 
} finally { 
alert("welcome to the try catch article")
}

Các khối thử lồng nhau

Bạn cũng có thể lồng các khối thử, nhưng giống như mọi cách lồng khác trong JavaScript (ví dụ: if, for, v.v.), nó có xu hướng trở nên vụng về và khó đọc, vì vậy tôi khuyên bạn không nên làm như vậy. Nhưng đó là tôi.

Việc lồng các khối thử mang đến cho bạn lợi thế khi chỉ sử dụng một câu lệnh bắt cho nhiều câu lệnh thử. Mặc dù bạn cũng có thể quyết định viết một câu lệnh bắt cho mỗi khối thử, như sau:

try { 
try { 
throw new Error('oops');
} catch(e){
console.log(e) 
} finally { 
console.log('finally'); 
} 
} catch (ex) { 
console.log('outer '+ex); 
}

Trong trường hợp này, sẽ không có bất kỳ lỗi nào từ khối thử bên ngoài vì không có gì sai với nó. Lỗi xuất phát từ khối thử bên trong và nó đã tự xử lý xong (nó có câu lệnh bắt riêng). Hãy xem xét điều này dưới đây:

try { 
try { 
throw new Error('inner catch error'); 
} finally {
console.log('finally'); 
} 
} catch (ex) { 
console.log(ex);
}

Đoạn mã trên hoạt động hơi khác một chút: lỗi xảy ra trong khối thử bên trong không có câu lệnh bắt mà thay vào đó là câu lệnh cuối cùng.

Lưu ý rằng cố gắng bắt có thể được viết theo ba cách khác nhau: try...catch, try...finally, try...catch...finally), nhưng lỗi là do lần thử bên trong này.

Đọc thêm  Liên kết JavaScript với HTML bằng tập lệnh src Thuộc tính

Câu lệnh cuối cùng cho lần thử bên trong này chắc chắn sẽ hoạt động, bởi vì như chúng tôi đã nói trước đó, nó hoạt động bất kể điều gì xảy ra trong lần thử/bắt. Nhưng mặc dù lần thử bên ngoài không có lỗi, nhưng quyền kiểm soát vẫn được trao cho việc bắt lỗi của nó để ghi lại lỗi. Và thậm chí tốt hơn, nó sử dụng lỗi mà chúng tôi đã tạo trong câu lệnh thử bên trong vì lỗi đến từ đó.

Nếu chúng ta tạo lỗi cho lần thử bên ngoài, nó vẫn hiển thị lỗi bên trong đã tạo, ngoại trừ lỗi bên trong bắt lỗi của chính nó.

Bạn có thể thử với mã bên dưới bằng cách nhận xét phần bắt bên trong.

try { 
try { 
throw new Error('inner catch error');
} catch(e){ //comment this catch out
console.log(e) 
} finally { 
console.log('finally'); 
} 
throw new Error("outer catch error") 
} catch (ex) { 
console.log(ex);
}

Lỗi Rethrow

Câu lệnh catch thực sự bắt tất cả các lỗi xảy ra và đôi khi chúng ta có thể không muốn điều đó. Ví dụ,

"use strict" 
let x=parseInt(prompt("input a number less than 5")) 
try{ 
y=x-10 
if(y>=5) throw new Error(" y is not less than 5") 
else alert(y) 
}catch(e){ 
alert(e) 
}

Hãy giả sử trong một giây rằng số được nhập sẽ nhỏ hơn 5 (mục đích của “Sử dụng nghiêm ngặt” là để chỉ ra rằng mã sẽ được thực thi trong “chế độ nghiêm ngặt”). Với chế độ nghiêm ngặtchẳng hạn như bạn không thể sử dụng các biến không được khai báo (nguồn).

Tôi muốn câu lệnh thử đưa ra lỗi y không phải… khi giá trị của y lớn hơn 5 gần như là không thể. Lỗi ở trên nên dành cho y không ít… và không y không xác định.

Trong những tình huống như thế này, bạn có thể kiểm tra tên của lỗi và nếu đó không phải là điều bạn muốn, làm lại nó:

"use strict" 
let x = parseInt(prompt("input a number less than 5"))
try{
y=x-10 
if(y>=5) throw new Error(" y is not less than 5") 
else alert(y) 
}catch(e){ 
if(e instanceof ReferenceError){ 
throw e
}else alert(e) 
} 

Điều này sẽ đơn giản viết lại lỗi cho một câu lệnh thử khác để bắt hoặc phá vỡ tập lệnh tại đây. Điều này hữu ích khi bạn chỉ muốn theo dõi một loại lỗi cụ thể và các lỗi khác có thể xảy ra do sơ suất nên làm hỏng mã.

Phần kết luận

Trong bài viết này, tôi đã cố gắng giải thích các khái niệm sau liên quan đến try/catch:

  • Câu lệnh try/catch là gì và khi nào chúng hoạt động
  • Cách ném lỗi tùy chỉnh
  • Câu lệnh cuối cùng là gì và nó hoạt động như thế nào
  • Cách hoạt động của các câu lệnh try/catch Nesting
  • Làm thế nào để vẽ lại lỗi

Cảm ơn bạn đã đọc. Theo dõi tôi trên Twitter @fakoredeDami.





Zik.vn – Biên dịch & Biên soạn Lại

spot_img

Create a website from scratch

Just drag and drop elements in a page to get started with Newspaper Theme.

Buy Now ⟶

Bài viết liên quang

DMCA.com Protection Status