10.1 Khối try...catch
Xử lý ngoại lệ là một khía cạnh quan trọng trong lập trình, giúp cải thiện độ bền và độ tin cậy của mã.
Trong JavaScript để xử lý ngoại lệ, ta sử dụng các từ khóa try
, catch
, finally
và throw
.
Trong bài giảng này, chúng ta sẽ xem xét các từ khóa này, cú pháp và ví dụ sử dụng.
1. Khối try...catch
Cấu trúc try...catch
được sử dụng để xử lý lỗi xảy ra trong khối mã try
. Nếu có lỗi xảy ra trong khối
try
, điều khiển sẽ chuyển đến khối catch
, nơi lỗi có thể được xử lý.
Cú pháp:
try {
// Mã có thể gây ra ngoại lệ
} catch (error) {
// Mã để xử lý ngoại lệ
}
Trong ví dụ này, mặc dù chia cho không không gây ra lỗi trong JavaScript, nếu đó là một lỗi khác (ví dụ truy cập
biến không xác định), khối catch
sẽ xử lý nó:
try {
let result = 10 / 0;
console.log(result);
} catch (error) {
console.error('An error occurred:', error);
}
10.2. Khối finally
Khối finally
được sử dụng để thực thi mã, mã sẽ được thực thi bất kể ngoại lệ có xảy ra trong khối try
hay không. Khối finally
đi sau khối catch
.
Cú pháp:
try {
// Mã có thể gây ra ngoại lệ
} catch (error) {
// Mã để xử lý ngoại lệ
} finally {
// Mã sẽ luôn được thực thi
}
Trong ví dụ này, thông điệp This will always execute.
sẽ được in ra bất kể lỗi có xảy ra hay không:
try {
let result = 10 / 0;
console.log(result);
} catch (error) {
console.error('An error occurred:', error);
} finally {
console.log('This will always execute.');
}
10. 3. Toán tử throw
Toán tử throw
được sử dụng để ném ra ngoại lệ một cách rõ ràng. Với nó, ta có thể ném ra lỗi tuỳ chỉnh.
Cú pháp:
throw expression;
Trong đó:
expression
: bất kỳ biểu thức hoặc đối tượng nào sẽ được ném ra như một ngoại lệ
Ví dụ sử dụng
Trong ví dụ này, một lỗi được ném ra nếu cố chia cho không, và khối catch
xử lý lỗi này:
function divide(a, b) {
if (b === 0) {
throw new Error('Division by zero is not allowed.');
}
return a / b;
}
try {
let result = divide(10, 0);
console.log(result);
} catch (error) {
console.error('An error occurred:', error.message);
}
10.4 Ví dụ nâng cao và sử dụng
Ví dụ 1: Nhiều ngoại lệ
Đôi khi trong khối try
có thể xảy ra nhiều loại lỗi khác nhau. Bạn có thể xử lý chúng khác nhau,
sử dụng thuộc tính của đối tượng lỗi.
Trong ví dụ này, chúng ta xử lý lỗi cú pháp JSON tách biệt với các lỗi khác có thể xảy ra:
try {
JSON.parse('{ malformed JSON string }');
} catch (error) {
if (error instanceof SyntaxError) {
console.error('JSON Syntax Error:', error.message);
} else {
console.error('Unexpected Error:', error);
}
} finally {
console.log('Parsing attempt finished.');
}
Ví dụ 2: Khối try...catch lồng nhau
Bạn có thể sử dụng các khối try...catch
lồng nhau để xử lý lỗi chi tiết hơn.
Trong ví dụ này, lỗi xảy ra trong khối try
đầu tiên được xử lý bởi khối catch
bên trong,
sau đó sẽ ném lại lỗi để xử lý bởi khối catch
bên ngoài:
try {
try {
let result = divide(10, 0);
console.log(result);
} catch (innerError) {
console.error('Inner catch:', innerError.message);
throw innerError;
}
} catch (outerError) {
console.error('Outer catch:', outerError.message);
} finally {
console.log('Nested try...catch finished.');
}
function divide(a, b) {
if (b === 0) {
throw new Error('Division by zero is not allowed.');
}
return a / b;
}
Ví dụ 3: Sử dụng finally để giải phóng tài nguyên
Khối finally
hữu ích để giải phóng tài nguyên, như đóng file hoặc hoàn tất kết nối mạng.
Trong ví dụ này, file sẽ luôn đóng, bất kể lỗi xảy ra trong quá trình đọc hay không:
function readFile(filePath) {
let file;
try {
file = openFile(filePath); // Hàm mở file
// Làm việc với file
} catch (error) {
console.error('Error reading file:', error.message);
} finally {
if (file) {
closeFile(file); // Hàm đóng file
}
console.log('File processing finished.');
}
}
function openFile(path) {
// Logic mở file
}
function closeFile(file) {
// Logic đóng file
}
readFile('path/to/file.txt');
Xử lý ngoại lệ trong JavaScript sử dụng try
, catch
, finally
và throw
giúp tạo ra các ứng dụng đáng tin cậy và bền vững hơn. Hiểu và sử dụng đúng các cấu trúc này
giúp quản lý hiệu quả lỗi, giải phóng tài nguyên và cải thiện trải nghiệm người dùng.
GO TO FULL VERSION