Cấu trúc khối try …catch
Khuôn dạng tổng quát như sau: try{ // Các lệnh có khả năng gây lỗi } catch ( TypeException1 ex){ // Mã đựơc thực thi khi một ngoại lệ TypeException1 đựơc phát sinh trong khối try } catch ( TypeException2 ex){ ...
Khuôn dạng tổng quát như sau:
try{
// Các lệnh có khả năng gây lỗi
}
catch ( TypeException1 ex){
// Mã đựơc thực thi khi một ngoại lệ TypeException1 đựơc phát sinh trong khối try
}
catch ( TypeException2 ex){
// Mã đựơc thực thi khi một ngoại lệ TypeException2 đựơc phát sinh trong khối try
}
...
catch ( TypeExceptionN ex){
// Mã đựơc thực thi khi một ngoại lệ TypeExceptionN đựơc phát sinh trong khối try
}
Nếu không có một ngoại lệ nào phát sinh trong khối try thì các mệnh đề catch sẽ bị bỏ qua, trong trường hợp một trong các câu lệnh bên trong khối try gây ra một ngoại lệ thì, thì C# sẽ bỏ qua các câu lệnh còn lại trong khối try để đi tìm mã xử lý ngoại lệ, nếu kiểu ngoại lệ so khớp với kiểu ngoại lệ trong mệnh đề catch, thì mã lệnh trong khối catch đó sẽ được thực thi, nếu không tìm thấy một kiểu ngại lệ nào được so khớp C# sẽ kết thúc phương thức đó và chuyển biệt lệ đó ra phương thức đã gọi phương thức này quá trình này được tiếp tục cho đến khi tìm thấy mã xử lý biệt lệ, nếu không tìm thấy mã xử lý biệt lệ trong chuỗi các phương thức gọi nhau, chương trình có thể chấm dứt và in thông báo lỗi… Xem xét ví dụ sau:
using System;
class Program {
static void Main() {
int a = 10;
int b = 2;
int[] m ={ 1, 4, 6, 7 };
try {
int c = a / b;//Co khả năng sinh ra lỗi nếu mẫu số =0
Console.WriteLine("c={0}", c);
Console.WriteLine("m{0}={1}", c, m[c]);//m[c] có khả năng sinh ra lỗi nếu vượt ra ngoài chỉ sô của mảng
} catch (DivideByZeroException ex) {
Console.WriteLine(ex.Message);
} catch (IndexOutOfRangeException ex) {
Console.WriteLine(ex.Message);
} catch (Exception ex) {
Console.WriteLine(ex.Message);
}
Console.ReadKey();
}
}
Khối ‘finally’
Khi một ngoại lệ xuất hiện, phương thức đang được thực thi có thể bị dừng mà không được hoàn thành. Nếu điều này xảy ra, thì các đoạn mã phía sau (ví dụ như đoạn mã có chức năng thu hồi tài nguyên, như các lệnh đóng tập viết ở cuối phương thức) sẽ không bao giờ được gọi. Java cung cấp khối finally để giải quyết việc này. Thông thường khối ‘finally’ chứa các câu lệnh mang tính chất dọn dẹp như: đóng kết nối CSDL, đóng tệp tin,….
try{
// Các lệnh có khả năng gây lỗi
}
catch ( TypeException1 ex){
// Mã đựơc thực thi khi một ngoại lệ TypeException1 đựơc phát sinh trong khối try
}
catch ( TypeException2 ex){
// Mã đựơc thực thi khi một ngoại lệ TypeException2 đựơc phát sinh trong khối try
}
...
catch ( TypeExceptionN ex){
// Mã đựơc thực thi khi một ngoại lệ TypeExceptionN đựơc phát sinh trong khối try
} finally{
// khối lệnh nay luôn được thực hiện cho dù ngoại lệ có xảy ra trong khối try hay không.
}
Khối ‘finally’ là tuỳ chọn, không bắt buộc phải có. Khối này được đặt sau khối ‘catch’ cuối cùng. Chương trình sẽ thực thi câu lệnh đầu tiên của khối ‘finally’ ngay sau khi gặp câu lệnh ‘return’ hay lệnh ‘break’ trong khối ‘try’.
Khối ‘finally’ bảo đảm lúc nào cũng được thực thi, bất chấp có ngoại lệ xảy ra hay không.