Câu lệnh kết thúc finally

Một phần của tài liệu bài giảng lập trình hướng đối tượng c (Trang 63)

2. Bắt và xử lý ngoại lệ 1 Câu lệnh try…catch

2.3. Câu lệnh kết thúc finally

Trong một số trường hợp, chương trình cần đón bắt và xử lý các ngoại lệ có thể xảy ra khi mở file, khi kết nối với cơ sở dữ liệu hoặc truy cập tới các tài nguyên khác. Như đã trình bày ở phần trên, ta viết các lệnh có thể phát sinh ngoại lệ trong khối try và viết các lệnh xử lý

ngoại lệ trong các khối catch. Khi phát sinh ngoại lệ, trong các đoạn chương trình xử lý ngoại lệ thường tìm cách khắc phục sửa lỗi hoặc điều khiển việc kết thúc chương trình theo ý muốn của người lập trình.

Vì vậy, một việc mà trong bất cứ trường hợp ngoại lệ nào ta cũng cần phải chú ý đó là đóng file hoặc ngắt kết nối với cơ sở dữ liệu hoặc tài nguyên đang muốn truy nhập để giải phóng bộ nhớ đệm đã cấp phát cho những kết nối này. Việc này ta có thể giải quyết bằng cách viết các câu lệnh đóng file hoặc ngắt kết nối trong khối catch, nhưng nếu ta bắt nhiều ngoại lệ thì đoạn chương trình đóng file hoặc ngắt kết nối sẽ bị lặp đi lặp lại trong các khối catch mỗi khối một lần. Để tránh việc lặp lại này ta viết đoạn chương trình đó trong khối finally sau khối catch với ý nghĩa sau khi xử lý ngoại lệ thì các lệnh trong khối này luôn được thực hiện để giải quyết các công việc cần phải làm trong bất cứ trường hợp ngoại lệ nào xảy ra.

try {

//các câu lệnh có nguy cơ phát sinh lỗi }

catch (<Kiểu ngoại lệ> <Tên đối tượng ngoại lệ>) {

//các câu lệnh xử lý ngoại lệ tương ứng }

finally {

//các lệnh xử lý kết thúc khi có ngoại lệ }

Lƣu ý: khối finally phải đi đôi cùng với khối try phía trước, viết khối finally mà khuyết khối try sẽ là lỗi cú pháp

Ví dụ (V.6) Câu lệnh finally

Bước 1: Thêm một dự án dòng lệnh mới có tên „FinallyDemo‟ vào solution Session_V Bước 2: Chèn mã lệnh vào lớp Program.cs như bên dưới

class Program {

static void Main(string[] args) {

try {

// random = 0 or 1 or 2

int random = new Random().Next(0, 3); if (random == 0)

{

throw new Exception("Random = 0"); }

if (random == 1) {

Console.WriteLine("Random = 1");

return; }

Console.WriteLine("Random = 2"); }

catch (Exception ex) {

Console.WriteLine(ex.Message);

}

finally {

Console.WriteLine("Control flow reaches finally");

Console.ReadLine();

} } } }

Bước 3: Thiết lập dự án mặc định bằng cách click chuột phải vào „FinallyDemo‟ chọn Set as Startup project

Bước 4: Dịch và chạy chương trình nhiều lần ta đều thấy các lệnh trong khối finally được thực thi trong tất cả các trường hợp dù Random = 0, 1 hay là 2

Hình (V.6)Màn hình hiển thị khi random=0

Hình (V.7)Màn hình hiển thị khi random=2

Hình (V.8)Màn hình hiển thị khi random=1

Trong Ví dụ (V.6) biến nguyên random được gán giá trị là một số ngẫu nhiên trong các giá trị 0, 1 hoặc 2. Mỗi trường hợp của random thì chương trình rẽ theo một hướng xử lý khác nhau. Nếu bằng 0 thì sẽ ném ra một ngoại lệ, bằng 1 thì sẽ gặp lệnh return còn bằng 2 thì sẽ kết thúc chương trình. Sau khối try có khối catch để bắt ngoại lệ và khối finally. Nhưng dịch và chạy chương trình nhiều lần để xảy ra tất cả các trường hợp của random bằng 0, 1

hay 2 thì ta thấy các lệnh trong khối finally đều được thực hiện. Đó là cách hoạt động của khối finally.

Vì vậy, Khi mở file hoặc tạo kết nối tới cơ sở dữ liệu hoặc các tài nguyên khác, ta thường đặt đoạn mở trong khối try để bắt và xử lý các ngoại lệ có thể phát sinh từ việc này nhưng trong khối finally ta thường đặt các câu lệnh để đóng file hoặc ngắt kết nối tới các tài nguyên nhằm giải phóng bộ nhớ đã cấp phát

Một phần của tài liệu bài giảng lập trình hướng đối tượng c (Trang 63)

Tải bản đầy đủ (PDF)

(80 trang)