Ngôn Ngữ Lập Trình C#
Console.WriteLine(“{0}”, inner.Message);
inner = inner.InnerException;
}
Kết quả là chuỗi các ngoại lệ được phát sinh và được bắt giữ:
Retrieving exception history...
E2 - Func2 caught divide by zero
E1 – DivideByZero Exception
Câu hỏi và trả lời
Câu hỏi 1: Việc sử dụng catch không tham s vẻ như nhiều sức mạnh do chúng bắt
giữa tất cả các ngoại lệ. Tại sao chúng ta không luôn luôn sử dụng câu lệnh catch không
tham số để bắt các lỗi?
Trả lời 1: Mặc dù sử dụng catch duy nhất có rất nhiều sức mạnh, nhưng nó cũng làm mất rất
nhiều thông tin quan trọng về ngoại lệ được phát sinh. Khi đó chúng ta sẽ không biết chính
xác loại ngoại lệ xảy ra và khó có thể bảo trì cũng như khắc phục những ngoại lệ sau này. Về
phía người dùng cũng vậy. Nếu chương trình gặp ngoại lệ không thông báo ràng
cho nguời dùng thì thể làm cho họ hoang mang, thể đổ lỗi cho chương trình của
chúng ta không tốt ngay cả những lỗi không phải do ta. dụ như lỗi hết tài nguyên bộ nhớ
do người dùng sử dụng quá nhiều chương trình hoạt động cùng lúc. Tóm lạichúng ta nên
sử dụng catch với những tham số chi tiết để thực hiện tốt việc quản lý các ngoại lệ được phát
sinh.
Câu hỏi 2: Có phải tất cả những ngoại lệ được đối xử một cách bình đẳng?
Trả lời 2: Không phải, hai loại ngoại lệ, ngoại lệ hệ thống ngoại lệ của chương trình
ứng dụng. Ngoại lệ của chương trình ứng dụng thì sẽ không kết thúc chương trình. Còn
ngoại lệ hệ thống thì sẽ kết thúc chương trình. Nói chung đó những ngoại lệ xuất hiện
trước đây. Hiện nay thì người ta chia ra nhiều mức độ ngoại lệ và tùy theo từng mức độ của
ngoại lệ chương trình của chúng ta sẽ được nhận những ứng xử khác nhau. Để biết thêm
chi tiết chúng ta có thể đọc thêm trong tài liệu .NET Framework về xử lý ngoại lệ.
Câu hỏi 3: Như câu trả lời bên trên tại sao tôi phải tìm hiểu nhiều về các ngoại lệ và cách thức
xử lý các ngoại lệ khi chúng được phát sinh?
Trả lời 3: Việc xây dựng một chương trình ứng dụng hết sức phức tạp, chương trình luôn
tiếm ẩn những yếu tố không ổn định thể phát sinh các ngoại lệ dẫn đến những lỗi
không mong muốn. Việc thực hiện bắt giữ các ngoại lệ hết sức cần thiết trong chương
trình, cho phép chúng ta xây dựng được chương trình hoàn thiện hơn xử các thông
điệp ngoại lệ tốt hơn. Tìm hiểu những ngoại lệ đem đến cho chúng ta nhiều kinh nghiệm
trong việc xây dựng các chương trình phức tạp hơn.
Câu hỏi thêm
Câu hỏi 1: Hãy cho biết các từ khóa được sử dụng để xử lý ngoại lệ?
Xử Ngoại Lệ
386
Ngôn Ngữ Lập Trình C#
Câu hỏi 2: Phân biệt giữa lỗi và ngoại lệ?
Câu hỏi 3: Khi thực hiện việc bắt giữ các ngoại lệ. Nếu nhiều mức bắt giữ ngoại lệ thì
chúng ta sẽ thực hiện mức nào. Từ chi tiết đến tổng quát, hay từ tổng quát đến chi tiết?
Câu hỏi 4: Ý nghĩa của từ khóa finally trong việc xử lý ngoại lệ?
Câu hỏi 5: Câu lệnh nào được dùng để phát sinh ngoại lệ?
Câu hỏi 6: Loại nào sau đây nên được xử theo ngoại lệ và loại nào thì nên được xử lý bởi
các mã lệnh thông thường?
a. Giá trị nhập vào của người dùng không nằm trong mức cho phép.
b. Tập tin không được viết mà thực hiện viết.
c. Đối mục truyền vào cho phương thức chứa giá trị không hợp lệ.
d. Đối mục truyền vào cho phương thức chứa kiểu không hợp lệ.
Câu hỏi 7: Nguyên nhân nào dẫn đến phát sinh ngoại lệ?
Câu hỏi 8: Khi nào thì ngoại lệ xuất hiện?
a. Trong khi tạo mã nguồn
b. Trong khi biên dịch
c. Trong khi thực thi chương trình
d. Khi yêu cầu đựơc đưa ta bởi người dùng cuối.
Câu hỏi 9: Khi nào thì khối lệnh trong finally được thực hiện?
Câu hỏi 10: Trong namespace nào chức các lớp liên quan đến việc xử các ngoại lệ? Hãy
cho biết một số lớp xử lý ngoại lệ quan trọng trong namespace này?
Bài tập
Bài tập 1: Hãy viết đoạn lệnh để thực hiện việc bắt giữa ngoại lệ liên quan đến câu lệnh sau
đây:
Ketqua = Sothu1 / Sothu2;
Bài tập 2: Chương trình sau đây có vấn đề. Hãy xác định vấn đề có thể phát sinh ngoại lệ khi
chạy chương trình. Và viết lại chương trình hoàn chỉnh gồm các lệnh xử lý ngoại lệ:
-----------------------------------------------------------------------------
using System;
public class Tester
{
public static void Main()
{
uint so1=0;
int so2, so3;
so2 = -10;
so3 = 0;
// tính giá trị lại
Xử Ngoại Lệ
387
Ngôn Ngữ Lập Trình C#
so1 -= 5;
so2 = 5/so3;
// xuất kết quả
Console.WriteLine("So 1: {0}, So 2:{1}", so1, so2);
}
}
-----------------------------------------------------------------------------
Bài tập 3: Chương trình sau đây thể dẫn đến ngoại lệ hay không? Nếu thì hãy cho biết
ngoại lệ thể được phát sinh. Hãy viết lại chương trình hoàn chỉnh xử các ngoại lệ
bằng cách đưa ra thông điệp về ngoại lệ được phát sinh.
-----------------------------------------------------------------------------
using System;
using System.IO;
public class Tester
{
public static void Main()
{
string fname = "test3.txt";
string buffer;
StreamReader sReader = File.OpenText(fname);
while ( (buffer = sReader.ReadLine()) !=null)
{
Console.WriteLine(buffer);
}
}
}
-----------------------------------------------------------------------------
Bài tập 4: Hãy xem lại các ví dụ trong các chương trước, ví dụ nào thể phái sinh ngoại lệ
thì hãy thêm các đoạn xử lý ngoại lệ cho ví dụ đó.
Xử Ngoại Lệ
388
Ngôn Ngữ Lập Trình C#
Dùng Visual Studio .NET Xây Dựng Ứng Dụng Windows Form
389