Try - Catch: Xử lý lỗi trong JavaScript

Ngày đăng: 06/10/2020   -    Cập nhật: 06/10/2020


Sẽ có rất nhiều lỗi không lường trước khi lập trình. Hiểu được điều đó, JavaScript có cung cấp cơ chế xử lý lỗi đó là try - catch - finally. Cùng mình tìm hiểu về nó nhé.

Try Catch trong JavaScript

1. Tại sao cần bắt lỗi và xử lý lỗi


JavaScript là một ngôn ngữ lỏng lẻo (dynamic), nó không đưa ra lỗi trong lúc biên dịch.

Một số trường hợp bạn sẽ gặp phải lúc runtime error cho những biến không được định nghĩa hoặc là gọi những hàm chưa được định nghĩa, hoặc là lỗi do nhập sai, lỗi xuất hiện một cách không lường trước được.

Một lỗi runtime error là một lỗi rất nghiêm trọng.

Nó sẽ phơi bày bộ mặt yếu kém của bạn cho người dùng thấy.

Khiến họ có trải nghiệm tệ hại.


Mặc dù, Bug là everywhere!!!

Nhưng, bạn cần lường trước để bắt lỗi và xử lý nó.

Tại sao cần xử lý lỗi trong JavaScript

Để giải quyết vấn đề này, ta có:

2. Try - Catch - Finally


Cơ chế bắt và xử lý lỗi try - catch - finally trong JavaScript cũng tương tự như Java hay C#

Cú pháp try - catch - finally:


try {
    // Khối lệnh có thể xảy ra lỗi
}
catch (ex) {
    // Khối lệnh thực thi nếu có lỗi
}
finally {
    // Khối lệnh này sẽ được thực thi
    // cho dù có lỗi hay không lỗi
}
 

Trong đó:

  • try {...}: Bao quanh vùng code khả nghi, có khả năng sinh ra lỗi.
  • catch { ... }: Xử lý thông tin nếu có lỗi. Kiểu như là log file hay là log database hoặc xuất ra màn hình để người lập trình dễ kiểm soát. Hay đơn giản là điều hướng, thông báo lỗi một cách thân thiện hơn cho người dùng.
  • finally { ... }: Đoạn code này luôn luôn được gọi để xử lý các tác vụ còn lại, ví dụ như reset biến hay các tác vụ khác.
  • ex: Là biến đại diện cho lỗi (bạn có thể đặt thế nào tùy thích). Nó sẽ nhận sáu giá trị khác nhau có thể được trả về nếu chương trình bị lỗi. (Chúng ta sẽ tìm hiểu ở phần dưới)

Một ví dụ về câu lệnh try - catch - finally:


document.write("<h2>Lập trình JavaScript căn bản</h2>");
try {
    document.write("<p>Câu lệnh try-catch trong JavaScript</p>");
    alertrt("<p>Câu lệnh này có lỗi nè</p>"); //Cố tình để câu lệnh này có lỗi nè
    document.write("<p>Câu lệnh này đúng nè</p>");
catch (ex) {
    document.write("<p>Nếu trong try có lỗi thì dòng này sẽ chạy nè</p>");
    document.write(
        "<p>Dòng này thông báo lỗi nè: " + ex.toString() + "</p>"
    );
finally {
    document.write("<p>Cái này nó luôn chạy nè</p>");
}
 

Kết quả chạy trên trình duyệt như sau:

Ví dụ Try - Catch - Finally trong JavaScript

Kết quả trên cho thấy:


+ Dòng lệnh đầu tiên là in ra: Lập trình JavaScript căn bản.

+ Khối try:

  • Dòng lệnh thứ nhất đúng nên in ra text trên trình duyệt
  • Dòng lệnh thứ hai sai từ khóa nên sẽ không thực thi và chuyển sang catch để bắt lỗi.
  • Dòng lệnh thứ ba sẽ không được thực thi vì dòng lệnh phía trên nó đã bị lỗi.

+ Khối catch:

  • Dòng lệnh thứ nhất được in ra: Điều này có nghĩa là trong try có lỗi thì catch mới chạy.
  • Dòng lệnh thứ hai: In ra lỗi bắt được ở dạng chuỗi.

+ Khối finally:

  • Dòng lệnh trong này chạy vì cho dù có lỗi hay không có lỗi ở phần try thì đoạn code trong finally vẫn được thực thi.

Một ví dụ khác về try - catch - finally:


try {
    // Cố tình log một biến chưa được khai báo
    console.log(c);
catch (ex) {
    // In ra màn hình console thông báo lỗi
    console.log(ex.message);
finally {
    console.log("Không quan tâm lỗi hay không");
}
 

Khi chạy chương trình, kết quả nhận được là:


c is not defined
Không quan tâm lỗi hay không
 

3. Câu lệnh throw


Khi mà xảy ra một lỗi, JavaScript sẽ tự động dừng và tạo ra một thông báo lỗi.

Khi đó JavaScript sẽ ném ra một ngoại lệ (ném một lỗi).

Thực sự là JavaScript sẽ tạo một đối tượng lỗi (Error Object) với hai thuộc tính: Tên (name) và Thông báo lỗi (message).

Nhưng khí sử dụng câu lệnh throw, nó cho phép bạn tạo ra một lỗi tùy chỉnh (custom error) của mình.

Về mặt kỹ thuật một chút thì bạn có thể tự ném một ngoại lệ ra ngoài (ném một lỗi) mà bạn tạo ra.

Ngoại lệ có thể là chuỗi JavaScript, số, boolean hoặc một đối tượng. Lệnh throw thường sẽ được đặt trong try.

Ví dụ:



throw "Infinity"//Ném ra một chuỗi
throw 0//Ném ra một số
 

> Lưu ý: Sau khi câu lệnh throw được thực thi thì một lỗi sẽ đươc tạo ra, điều đó cũng đồng nghĩa với việc câu lệnh bị lỗi. Do đó, những câu lệnh sau throw sẽ không được thực thi nữa.

Ví dụ: Mình sử dụng lại đoạn code phía trên nhưng thêm vào một câu lệnh throw trước câu lệnh bị lỗi trước đó.



document.write("<h2>Lập trình JavaScript căn bản</h2>");
try {
    document.write("<p>Câu lệnh try-catch trong JavaScript</p>");
    throw "Lỗi này mình tạo ra nè"// Ném ra một lỗi nè
    alertrt("<p>Câu lệnh này có lỗi nè</p>"); // Cố tình để câu lệnh này có lỗi nè
    document.write("<p>Câu lệnh này đúng nè</p>");
catch (ex) {
    document.write("<p>Nếu trong try có lỗi thì dòng này sẽ chạy nè</p>");
    document.write(
        "<p>Dòng này thông báo lỗi nè: " + ex.toString() + "</p>"
    );
finally {
    document.write("<p>Cái này nó luôn chạy nè</p>");
}
 

Kết quả như sau:

Ví dụ câu lệnh throw trong JavaScript - 1

Dòng đầu tiên sẽ chạy tức là in ra: Lập trình JavaScript căn bản.

+ Khối try:


  • Dòng lệnh thứ nhất đúng nên in ra text trên trình duyệt
  • Dòng lệnh thứ hai là dòng lệnh throw nên nó cũng đươc xem là câu lệnh sai sẽ chuyển sang catch.
  • Các câu lệnh bên dưới sẽ dừng thực thi.

+ Khối catch:

  • Dòng lệnh thứ nhất được in ra: Điều này có nghĩa là trong try có lỗi (Lỗi do dòng lệnh throw) thì catch mới chạy.
  • Dòng lệnh thứ hai được thực thi. Cho thấy catch đã sẽ bắt lỗi từ throw.

+ Khối finally:

  • Tương tự như ví dụ trên. Dòng lệnh finally này là tùy chọn bạn có thể sử dụng hoặc không.

Ví dụ: Mình thử dùng throw để kiểm tra điều kiện nhập vào.

Đầu tiên ta có HTML:



<h3>Nhập một số dương nhỏ hơn 100</h3>
<input type="text" id="number" />
<button type="button" id="btn">Kiểm tra</button>
<p id="message"></p>
<script>
 

Bây giờ thì tạo một hàm kiểm tra dữ liệu mà người dùng nhập:


// Tạo hàm kiểm tra dữ liệu nhập vào
function checkInput() {
    // Lấy số mà người dùng vừa nhập
    var number = document.getElementById("number").value;

    // Xử lý lỗi với try catch và throw
    try {
        if (number == "") {
            throw "Bạn chưa nhập giá trị";
        } else if (isNaN(number)) {
            throw "Giá trị bạn nhập không phải là một số";
        } else if (number < 1) {
            throw "Giá trị vừa nhập nhỏ hơn giá trị cho phép";
        } else if (number >= 100) {
            throw "Giá trị vừa nhập lớn hơn giá trị cho phép";
        }
        document.getElementById("message").innerHTML = "Hợp lệ";
    } catch (ex) {
        document.getElementById("message").innerHTML = ex;
    }
}
 

Bây giờ, ta thêm hàm xử lý này vào sự kiện click. Khi người dùng nhập xong, click vào nút Kiểm tra thì sẽ thực hiện hàm checkInput:


// Xử lý sự kiện click nút
document.getElementById("btn").addEventListener("click"checkInput);
 

Chạy trên trình duyệt để thử kết quả:

Ví dụ câu lệnh throw trong JavaScript - 2

> Lưu ý: Câu lệnh throw có nghĩa là "NÉM" còn câu lệnh catch có nghĩa là "BẮT". Vì thế, throw ném ra cái gì thì catch bắt cái đó.

4. Một số lỗi thường gặp


Như đã nói ở trên, JavaScript có một đối tượng lỗi được tích hợp sẵn để cung cấp thông tin lỗi mà bạn có thể truy cập thông qua biến đại diện ex (người ta hay dùng từ err)

Và đây là những lỗi thường gặp được tổng hợp lại.


Tên lỗi Mô tả
EvalError Lỗi xảy ra trong hàm eval()
RangeError Lỗi vượt quá khoảng giá trị
ReferenceError Tham chiếu không hợp lệ
SyntaxError Lỗi cú pháp
TypeError Lỗi kiểu
URIError Lỗi xảy ra trong hàm encodeURI()

Để truy cập vào thuộc tính namemessage của đối tượng lỗi, bạn chỉ cần thực hiện như sau:


// Truy cập tên lỗi
err.name;
// Truy cập thông báo lỗi
err.message;
 

Ví dụ:


// Khai báo một hằng số
const number = 1;

try {
    // Cố tình gán lại giá trị cho hằng số
    number = 2;
catch (err) {
    // In ra tên lỗi
    console.log(err.name);
    // In ra thông báo lỗi
    console.log(err.message);
}
 

Tổng kết


Vậy là mình vừa giới thiệu cho các bạn về câu lệnh try - catch - finally JavaScript. Bạn cung đã học được cách sử dụng câu lệnh throw để ném ra một lỗi tùy chỉnh.

Các câu lệnh bắt và xử lý lỗi này rất hữu ích đúng không nào. Bạn hãy làm lại các ví dụ để hiểu hơn nhé. Hẹn gặp lại các bạn ở bài học tiếp theo.


Bình luận Facebook
Đăng ký tư vấn
Nhân viên gọi điện tư vấn miễn phí sau khi đăng ký
Được cập nhật các ưu đãi sớm nhất
Hotline: 0383180086
Tên không được để trống
Số điện thoại không được để trống
Email không được để trống
Hãy đăng ký để nhận những thông tin mới nhất về học bổng mới nhất tại NIIT - ICT Hà Nội
top
Đóng lại Đăng ký học tại NIIT - ICT Hà Nội
6260+ học viên đã theo học tại NIIT - ICT Hà Nội và có việc làm tốt trong ngành lập trình. Nắm lấy cơ hội ngay hôm nay!
Chọn khóa học
  • KHÓA HỌC LẬP TRÌNH FRONT END VỚI REACT.JS
  • KHÓA HỌC LẬP TRÌNH PHP WEB
  • Khóa học PHP Full stack [2023] cho người mới bắt đầu
  • Khóa học BIG DATA với Hadoop và Spark
  • Khóa học Lập trình Android tại Hà Nội
  • [Tuyển sinh 2023] Lập trình viên Quốc tế DigiNxt
  • Khóa học Tiền lương & Phúc lợi (C&B Excel) tại Hà Nội
  • LẬP TRÌNH GAME
    • Khóa học Lập trình Game Unity
  • LẬP TRÌNH WEB FRONT END
    • KHÓA HỌC PYTHON HƯỚNG ĐỐI TƯỢNG
    • KHÓA HỌC ANGULAR & TYPESCRIPT (FRONT END)
  • LẬP TRÌNH WEB BACK END
    • LẬP TRÌNH JAVA WEB VỚI FRAME WORK
    • Lập trình Web với Django
    • Lập trình PHP với Laravel Framework
  • CHƯƠNG TRÌNH ĐÀO TẠO ỨNG DỤNG CÔNG NGHỆ
    • Khóa học Tiền lương & Phúc lợi (C&B Excel) tại TP HCM
  • LẬP TRÌNH WEB FULL STACK
    • Khóa học Java Full stack (IJFD)
  • LẬP TRÌNH MOBILE
    • FRONT-END VỚI REACTJS VÀ REACT NATIVE
    • Lập trình Android Nâng cao
  • ĐÀO TẠO CHO DOANH NGHIỆP
    • KHÓA HỌC BUSINESS ANALYSIC TỪ CƠ BẢN ĐẾN NÂNG CAO 2023
    • Khóa học Magento: Làm chủ CMS TMĐT lớn nhất
    • Khóa học IOT: Xây dựng Sản phẩm IOT với Raspberry Pi
    • Khóa học Automation Testing Chuyên nghiệp
  • KHÓA HỌC DỰ ÁN
    • Học sử dụng bộ Office: Word, Excel, Power Point, Mail chuyên nghiệp
  • KHÓA HỌC KHÁC
    • VBA Excel Toàn Tập (Cơ Bản - Nâng Cao)
    • VBA Excel Nâng cao
    • Khóa học JMeter: Performance Testing
    • Khóa học Tester đạt chuẩn Quốc tế ISTQB Foundation Level
    • Khoá Học Tester đạt chuẩn quốc tế ISTQB Advanced Level
Bạn chưa chọn khóa học cần đăng ký
Tên không được để trống
Số điện thoại không được để trống
Email không được để trống
Đăng ký học thành công!
Cảm ơn bạn đã đăng ký học tại NIIT - ICT HÀ NỘI!