Dọn dẹp ngoài lệ với try và finally

Một phần của tài liệu Lập trình hướng đối tượng với C docx (Trang 135 - 137)

Trong một số tình huống, việc phát sinh ngoại lệ và unwind stack có thể tạo ra một số vấn đề. Ví dụ như nếu chúng ta mở một tập tin hay trường hợp khác là xác nhận một tài nguyên, chúng ta có thể cần thiết một cơ hội để đóng một tập tin hay là giải phóng bộ nhớ đệm mà chương trình đã chiếm giữ trước đó.

Ghi chú: Trong ngôn ngữ C#, vấn đề này ít xảy ra hơn do cơ chế thu dọn tự động của C#

ngăn ngừa những ngoại lệ phát sinh từ việc thiếu bộ nhớ.

Tuy nhiên, có một số hành động mà chúng ta cần phải quan tâm bất cứ khi nào một ngoại lệ được phát sinh ra, như việc đóng một tập tin, chúng ta có hai chiến lược để lựa chọn thực hiện. Một hướng tiếp cận là đưa hành động nguy hiểm vào trong khối try

và sau đó thực hiện việc đóng tập tin trong cả hai khối catch và try. Tuy nhiên, điều này gây ra đoạn chương trình không được đẹp do sử dụng trùng lặp lệnh. Ngôn ngữ C# cung cấp một sự thay thế tốt hơn trong khối finally.

Đoạn chương trình bên trong khối catch được đảm bảo thực thi mà không quan tâm đến việc khi nào thì một ngoại lệ được phát sinh. Phương thức TestFunc() trong ví dụ 5.2 minh họa việc mở một tập tin như là hành động đầu tiên của nó, sau đó phương thức thực hiện một vài các phép toán toán học, và sau đó là tập tin được đóng. Có thể trong quá trình mở tập tin cho đến khi đóng tập tin chương trình phát sinh ra một ngoại lệ. Nếu xuất hiện ngoại lệ, và khi đó tập tin vẫn còn mở. Người phát triển biết rằng không có chuyện gì xảy ra, và cuối của phương thức này thì tập tin sẽ được đóng. Do chức năng đóng tập tin được di chuyển vào trong khối finally, ở đây nó sẽ được thực thi mà không cần quan tâm đến việc có phát sinh hay không một ngoại lệ trong chương trình.

Ví dụ 5.2: Sử dụng khối finally.

class NgoaiLe {

public void MoTep() {

StreamWriter f = new StreamWriter(new FileStream("ketqua.txt", FileMode.Append));

try

{ int x, y;

Console.Write("Gia tri x: "); x = int.Parse(Console.ReadLine()); Console.Write("Gia tri y: "); y = int.Parse(Console.ReadLine()); double z = (double)x / y;

Console.Write("Nhap vao mot so: "); int so = int.Parse(Console.ReadLine()); f.WriteLine("{0}/{1}={2}", x, y, z);

//f.Close(); }

// Các câu lệnh đặt trong khối catch được xử lý khi có ngoại lệ xảy ra. catch(Exception ex)

{

//f.Close(); }

// Các câu lệnh đặt trong khối finally sẽ được xử lý dù có hay không có ngoại lệ phát sinh.

Finally {

f.Close(); }

StreamReader fd = new StreamReader(new FileStream("ketqua.txt", FileMode.Open)); Console.WriteLine(fd.ReadToEnd()); fd.Close(); Console.ReadLine(); } } class chay {

static void Main() {

NgoaiLe f = new NgoaiLe(); f.MoTep();

} }

Một phần của tài liệu Lập trình hướng đối tượng với C docx (Trang 135 - 137)

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

(142 trang)