1. Trang chủ
  2. » Công Nghệ Thông Tin

Tài liệu Xử lí ngoại lệ phần cuối pdf

8 350 0
Tài liệu đã được kiểm tra trùng lặp

Đang tải... (xem toàn văn)

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề Custom exception situation
Định dạng
Số trang 8
Dung lượng 182,92 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

E2 - Func2 caught divide by zero E1 – DivideByZeroException ---Để hiểu rõ hơn ta có thể dùng trình debugger để chạy từng bước chương trình khi đó ta sẽ hiểu rõ từng bước thực thi cũng n

Trang 1

E3 – Custom Exception Situation!

Retrieving exception history E2 -

Func2 caught divide by zero E1 –

DivideByZeroException

-Để hiểu rõ hơn ta có thể dùng trình debugger để chạy từng bước chương trình khi đó

ta sẽ hiểu rõ từng bước thực thi cũng như việc phát sinh các ngoại lệ

Trang 2

Chương trình bắt đầu với việc gọi hàm DangerousFunc1() trong khối try:

try

{

DangerousFunc1();

}

DangerousFunc1() gọi DangerousFunc2(), DangerousFunc2() lại gọi DangerousFunc3(), và cuối cùng DangerousFunc3() gọi DangerousFunc4() Tất cả

việc gọi này điều nằm trong khối try Cuối cùng, DangerousFunc4() phát sinh ra

ngoại lệ DivideByzeroException Ngoại lệ này bình thường có chứa thông điệp bên trong nó, nhưng ở đây chúng ta tự do dùng thông điệp mới Để dễ theo dõi chúng ta đưa vào các chuỗi xác nhận tuần tự các sự kiện diễn ra

Ngoại lệ được phát sinh trong DangerousFunc4() và nó được bắt trong khối catch trong hàm DangerousFunc3() Khối catch trong DangerousFunc3() sẽ bắt các

ngoại lệ Arithmetic- Exception ( như là DivideByZeroException), nó không thực hiện hành động nào mà chỉ đơn giản là phát sinh lại ngoại lệ:

catch ( System.ArithmeticException)

{

throw;

}

Cú pháp để thực hiện phát sinh lại cùng một ngoại lệ mà không có bất cứ bổ sung hay

hiệu chỉnh nào là : throw

Do vậy ngoại lệ được phát sinh cho DangerousFunc2(), khối catch trong

DangerousFunc2() thực hiện một vài hành động và tiếp tục phát sinh một ngoại lệ có kiểu mới Trong hàm khởi dựng của ngoại lệ mới, DangerousFunc2() truyền một

chuỗi thông điệp mới (“E2 - Func2 caught divide by zero”) và ngoại lệ ban đầu Do

vậy ngoại lệ ban đầu (E1) trở thành ngoại lệ bên trong của ngoại lệ mới (E2) Sau đó hàm DangerousFunc2() phát sinh ngoại lệ này (E2) cho hàm DangerousFunc1()

DangerousFunc1() bắt giữ ngoại lệ này, làm một số công việc và tạo ra một ngoại lệ mới có kiểu là MyCustomException, truyền vào hàm khởi dựng của ngoại lệ mới

một chuỗi mới (“E3 – Custom Exception Situation!”) và ngoại lệ được bắt giữ (E2)

Chúng ta nên nhớ rằng ngoại lệ được bắt giữ là ngoại lệ có chứa ngoại lệ

DivideByZeroException (E1) bên trong nó Tại thời điểm này, chúng ta có một ngoại lệ kiểu MyCustomException (E3), ngoại lệ này chứa bên trong một ngoại lệ kiểu

Exception (E2), và đến lượt nó chứa một ngoại lệ kiểu DivideByZeroException (E1) bên trong Sau cùng ngoại lệ được phát sinh cho hàm TestFunc;

Khi khối catch của TestFunc thực hiện nó sẽ in ra thông điệp của ngoại lệ :

E3 – Custom Exception Situation!

Trang 3

while ( inner != null) {

Trang 4

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 có tham số có vẻ như có 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 có 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ệ mà không có thông báo rõ ràng cho nguời dùng thì có thể làm cho họ hoang mang, và có 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 Ví 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ại là chú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âuhỏ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, có hai loại ngoại lệ, ngoại lệ hệ thống và 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 đó là 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ệ mà 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âuhỏ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

Trang 5

trình luôn tiếm ẩn những yếu tố không ổn định và có 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ệ là hết sức cần thiết trong chương trình, nó cho phép chúng ta xây dựng được chương trình hoàn thiện hơn và xử lý 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âuhỏi 1: Hãy cho biết các từ khóa được sử dụng để xử lý ngoại lệ?

Trang 6

Câuhỏ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 có 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âuhỏi 4: Ý nghĩa của từ khóa finally trong việc xử lý ngoại

lệ?

Câuhỏ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ử lý 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âuhỏi 7: Nguyên nhân nào dẫn đến phát sinh ngoại lệ?

Câuhỏ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âuhỏ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ử lý 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()

{

Trang 7

so2 = -10; so3 = 0; // tính giá trị lại

Trang 8

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 có thể dẫn đến ngoại lệ hay không? Nếu có thì hãy cho biết ngoại lệ có thể được phát sinh Hãy viết lại chương trình hoàn chỉnh có xử

lý 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 có thể phái sinh ngoại

lệ thì hãy thêm các đoạn xử lý ngoại lệ cho ví dụ đó

Ngày đăng: 23/12/2013, 19:15

TỪ KHÓA LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm