Tải bản đầy đủ (.pdf) (5 trang)

Giáo trình phân tích khả năng truy cập các thành phần tùy biến trong mảng có kích thước khác nhau p10 pptx

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (905.52 KB, 5 trang )

Ngôn Ngữ Lập Trình C#
public static void Main()
{
Console.WriteLine(“Enter Main ”);
Test t = new Test();
t.Func1();
Console.WriteLine(“Exit Main ”);
}
public void Func1()
{
Console.WriteLine(“Enter Func1 ”);
Func2();
Console.WriteLine(“Exit Func1 ”);
}
public void Func2()
{
Console.WriteLine(“Enter Func2 ”);
throw new System.Exception();
Console.WriteLine(“Exit Func2 ”);
}
}
}

 Kết quả:
Enter Main
Enter Func1
Enter Func2
Exception occurred: System.Exception: An exception of type System.Exception
was throw.
at Programming_CSharp.Test.Func2() in exception01.cs:line 26
at Programming_CSharp.Test.Func1() in exception01.cs:line 20


at Programming_CSharp.Test.Main() in exception01.cs:line 12

Ví dụ minh họa đơn giản này viết ra màn hình console thông tin khi nó nhập vào trong một
hàm và chuẩn bị đi ra từ một hàm. Hàm Main() tạo thể hiện mới của kiểu Test và sau đó gọi
hàm Func1(). Sau khi in thông điệp “Enter Func1”, hàm Func1() này gọi hàm Func2(). Hàm
Func2() in ra thông điệp đầu tiên và phát sinh một ngoại lệ kiểu System.Exception. Việc thực
thi sẽ ngưng ngay tức khắc, và CLR sẽ tìm kiếm trình xử lý ngoại lệ trong hàm Func2(). Do
không tìm thấy ở đây, CLR tiếp tục vào stack lấy hàm đã gọi trước tức là Func1 và tìm kiếm
Xử Lý Ngoại Lệ
367
.
.
Ngôn Ngữ Lập Trình C#
trình xử lý ngoại lệ. Một lần nữa trong Func1 cũng không có đoạn xử lý ngoại lệ. Và CLR trả
về hàm Main. Tại hàm Main cũng không có, nên CLR sẽ gọi trình mặc định xử lý ngoại lệ,
việc này đơn giản là xuất ra một thông điệp lỗi.
Câu lệnh catch
Trong C#, một trình xử lý ngoại lệ hay một đoạn chương trình xử lý các ngoại lệ được gọi là
một khối catch và được tạo ra với từ khóa catch.
Trong ví dụ 13.2 sau, câu lệnh throw được thực thi bên trong khối try, và một khối catch
được sử dụng để công bố rằng một lỗi đã được xử lý.
 Ví dụ 13.2: bắt giữ ngoại lệ.

namespace Programming_CSharp
{
using System;
public class Test
{
public static void Main()
{

Console.WriteLine(“Enter Main ”);
Test t = new Test();
t.Func1();
Console.WriteLine(“Exit Main ”);
}
public void Func1()
{
Console.WriteLine(“Enter Func1 ”);
Func2();
Console.WriteLine(“Exit Func1 ”);
}
public void Func2()
{
Console.WriteLine(“Enter Func2 ”);
try
{
Console.WriteLine(“Entering try block ”);
throw new System.Exception();
Console.WriteLine(“Exiting try block ”);
}
Xử Lý Ngoại Lệ
368
.
.
Ngôn Ngữ Lập Trình C#
catch
{
Console.WriteLine(“Exception caught and handled.”);
}
Console.WriteLine(“Exit Func2 ”);

}
}
}

 Kết quả:
Enter Main
Enter Func1
Enter Func2
Entering try block
Exception caught and handled.
Exit Func2
Exit Func1
Exit Main

Ví dụ 13.2 cũng tương tự như ví dụ minh họa trong 13.1 ngoại trừ chương trình thêm vào
trong một khối try/catch. Thông thường chúng ta cũng co thể đặt khối try bao quanh những
đoạn chương trình tiềm ẩn gây ra sự nguy hiểm, như là việc truy cập file, cấp phát bộ nhớ
Theo sau khối try là câu lệnh catch tổng quát. Câu lệnh catch trong ví dụ này là tổng quát
bởi vì chúng ta không xác định loại ngoại lệ nào mà chúng ta bắt giữ. Trong trường hợp tổng
quát này thì khối catch này sẽ bắt giữ bất cứ ngoại lệ nào được phát sinh. Sử dụng câu lệnh
catch để bắt giữ ngoại lệ xác định sẽ được thảo luận trong phần sau của chương.
Trong ví dụ 13.2 này, khối catch đơn giản là thông báo ra một ngoại lệ được bắt giữ và được
xử lý. Trong ví dụ của thế giới thực, chúng ta có thể đưa hành động đúng để sửa chữa vấn đề
mà gây ra sự ngoại lệ. Ví dụ, nếu người sử dụng đang cố mở một tập tin có thuộc tính chỉ đọc,
chúng ta có thể gọi một phương thức cho phép người dùng thay đổi thuộc tính của tập tin.
Nếu chương trình thực hiện thiếu bộ nhớ, chúng ta có thể phát sinh cho người dùng cơ hội để
đóng bớt các ứng dụng khác lại. Thậm chí trong trường hợp xấu nhất ta không khắc phục
được thì khối catch này có thể in ra thông điệp lỗi để người dùng biết.
Thử kiểm tra kỹ lại chương trình 13.2 trên, chúng ta sẽ thấy xuất hiện đoạn mã đi vào từng
hàm như Main(), Func1(), Func2(), và cả khối try. Chúng ta không bao giờ thấy nó thoát khối

lệnh try (tức là in ra thông báo “Exiting try block ”, hay thực hiện lệnh này), mặc dù nó vẫn
thoát ra theo thứ tự Func2(), Func1(), và Main(). Chuyện gì xảy ra?
Xử Lý Ngoại Lệ
369
.
.
Ngôn Ngữ Lập Trình C#
Khi một ngoại lệ được phát sinh, việc thi hành ngay lập tức sẽ bị tạm dừng và việc thi hành sẽ
được chuyển qua khối lệnh catch. Nó không bao giờ trả về luồng thực hiện ban đầu, tức là
các lệnh sau khi phát ra ngoại lệ trong khối try không được thực hiện. Trong trường hợp này
chúng ta sẽ không bao giờ nhận được thông báo “Exiting try block ”. Khối lệnh catch xử lý
lỗi và sau đó chuyển việc thực thi chương trình đến các lệnh tiếp sau khối catch.
Ở đây không có việc quay lại cuộc gọi hàm trước trong stack. Ngoại lệ bây giờ được xử lý,
không có vấn đề gì xảy ra, và chương trình tiếp tục hoạt động bình thường. Điều này trở nên
rõ ràng hơn nếu chúng ta di chuyển khối try/catch lên hàm Func1 như trong ví dụ minh họa
13.3 bên dưới.
 Ví dụ 13.3: Catch trong hàm gọi.

namespace Programming_CSharp
{
using System;
public class Test
{
public static void Main()
{
Console.WriteLine(“Enter Main ”);
Test t = new Test();
t.Func1();
Console.WriteLine(“Exit Main ”);
}

public void Func1()
{
Console.WriteLine(“Enter Func1 ”);
try
{
Console.WriteLine(“Entering try block ”);
Func2();
Console.WriteLine(“Exiting try block ”);
}
catch
{
Console.WriteLine(“Exception caught and handled.”);
}
Console.WriteLine(“Exit Func1 ”);
Xử Lý Ngoại Lệ
370
.
.
Ngôn Ngữ Lập Trình C#
}
public void Func2()
{
Console.WriteLine(“Enter Func2 ”);
throw new System.Exception();
Console.WriteLine(“Exit Func2 ”);
}
}
}

 Kết quả:

Enter Main
Enter Func1
Entering try block
Enter Func2
Exception caught and handled.
Exit Func1
Exit Main

Lúc này ngoại lệ không được xử lý bên trong hàm Func2(), mà nó được xử lý bên trong hàm
Func1(). Khi hàm Func2() được gọi, nó in câu lệnh thông báo vào hàm rồi phát sinh một
ngoại lệ. Việc thực hiện chương trình bị ngưng, CLR tìm kiếm phần xử lý ngoại lệ, nhưng
trong hàm này không có và CLR vào stack lấy hàm gọi trong trường hợp này là Func1(). Câu
lệnh catch sẽ được gọi, và việc thực thi tiếp tục thực hiện bình thường sau câu lệnh catch.
Hãy chắc chắn rằng chúng ta đã hiểu rõ tại sao câu lệnh “Exiting try block” và “Exit Func2”
không được in ra. Chúng ta có thể dùng cách cũ để kiểm tra việc này bằng cách dùng chương
trình debug cho chương trình chạy từng bước để tìm hiểu rõ hơn.
 Tạo một khối catch xác định:
Cho đến bây giờ chúng ta chỉ dùng khối catch tổng quát, tức là với bất cứ ngoại lệ nào cũng
được. Tuy nhiên chúng ta có thể tạo ra khối catch xác định để xử lý chỉ một vài các ngoại lệ
chứ không phải toàn bộ ngoại lệ, dựa trên kiểu của ngoại lệ phát sinh. Ví dụ 13.4 minh họa
cách xác định loại ngoại lệ mà chúng ta xử lý.
 Ví dụ13.4: Xác định ngoại lệ để bắt.

namespace Programming_CSharp
{
using System;
public class Test
Xử Lý Ngoại Lệ
371
.

.

×