Danh mục

Những chủ đề tiến bộ trong C# Lỗi và xử lí biệt lệ - Phần 2

Số trang: 17      Loại file: pdf      Dung lượng: 134.56 KB      Lượt xem: 10      Lượt tải: 0    
Jamona

Hỗ trợ phí lưu trữ khi tải xuống: 7,000 VND Tải xuống file đầy đủ (17 trang) 0
Xem trước 2 trang đầu tiên của tài liệu này:

Thông tin tài liệu:

Giả sử rằng người sử dụng gõ 1 số mà không nằm giữa 0 và 5 . điều này được đón bởi câu lệnh if và 1 đối tượng IndexOutOfRangeExceptionsẽ được khởi tạo và ném.vào lúc này máy tính sẽ ngay lập tức thoát khỏi khối try và tìm khối catch mà xử lí IndexOutOfRangeException. khối catch đầu tiên mà nó đến là khối này : catch (IndexOutOfRangeException e) { Console.WriteLine( "Exception: Number should be between 0 and 5." + e.Message); } ...
Nội dung trích xuất từ tài liệu:
Những chủ đề tiến bộ trong C# Lỗi và xử lí biệt lệ - Phần 2 Những chủ đề tiến bộ trong C# Lỗi và xử lí biệt lệ - Phần 2Giả sử rằng người sử dụng gõ 1 số mà không nằm giữa 0 và 5 . điều nàyđược đón bởi câu lệnh if và 1 đối tượng IndexOutOfRangeExceptionsẽ đượckhởi tạo và ném.vào lúc này máy tính sẽ ngay lập tức thoát khỏi khối try vàtìm khối catch mà xử lí IndexOutOfRangeException. khối catch đầu tiên mànó đến là khối này :catch (IndexOutOfRangeException e){Console.WriteLine(Exception: Number should be between 0 and 5. + e.Message);}Bởi vì khối catch này lấy 1 thông số của một lớp tương đương , điều này sẽđược truyền qua 1 thể hiện của biệt lệ và thực thi.trong trường hợp này,chúng ta trình bày,1 thông báo lỗi và thuộc tính exception.message (đáp lạichuỗi mà chúng ta đã truyền đến hàm dựng của IndexOutOfRange).sau khithực thi khối catch này , điều khiển chuyển đến khối finally, như là không cóbiệt lệ nào xuất hiện.Chú ý rằng chúng ta cũng cung cấp một khối catch khác :catch (Exception e){Console.WriteLine(An exception was thrown. Message was: +e.Message);}Khối catch này cũng có khả năng xử lý IndexOutOfRangeException nếukhông có sự kiện rằng biệt lệ đã được đón bắt bởi khối catch trước- một sựtham chiếu đến 1 lớp cơ sở có thể cũng chuyển đến bất kỳ 1 thể hiện của mộlớp dẫn xuất từ nó.và tất cả biệt lệ mà dẫn xuất từ system.exception . vậy tạisao khối catch này không được thực thi? câu trả lời là máy tính chỉ thực thikhối catch thích hợp đầu tiên mà nó tìm thấy. vậy tại sao khối catch thứ hainày lại nằm ở đây ? thật ra thì không chỉ đoạn mã của ta mới được bao phủbởi khối try ,mà bên trong khối, chúng ta thực sự gọi những phương thức biệt nhau trong namspace system ( Console.ReadLine(),riêngConsole.Write(), and Convert.ToInt32()), và bất kỳ phương thức nào trongđây cũng có thể ném ra một biệt lệ.Nếu chúng ta gõ một thứ gì không phải là số - say hoặc hello ,sau đó phươngthức convert.toin32() sẽ ném ra một biệt lệ của lớpSystem.FormatException, để chỉ định chuỗi được truyền vào toin32() khôngnằm trong định dạng mà có thể chuyển thành kiểu int. khi điều này xảy ra,máy tính sẽ truy vết xuyên suốt phương thức gọi , tìm hàm xử lí mà có thểxử lí biệt lệ này. khối catch đầu tiên của chúng ta ( cái mà bắtIndexOutOfRangeException) sẽ không thực hiện.máy tính tìm đến cái thứhai.cái này sẽ thi hành bởi vì FormatException là một dẫn xuất từ exception,vì vậy một thực thể FormatException có thể được truyền như là một thôngsố ở đây.Cấu trúc của ví dụ trên thực sự là kiểu tình huống đẹp với nhiều khốicatch.chúng ta sẽ bắt đầu với khối catch được thiết kế để bẫy trạng thái lỗicụ thể. sau đó, chúng ta hoàn thành với nhiều khối catch sẽ bao phủ bất kì lỗinào mà chúng ta không viết những hàm xử lí lỗi cụ thể.việc sắp xếp các khốicatch là quan trọng.nếu chúng ta viết tên 2 khối thứ tự ngược nhau , mã sẽkhông phiên dịch bởi vì khối catch thứ hai sẽ không bao giờ có thể đượctham chiếu đến ( khối catch exception có thể bắt tất cả các biệt lệ)Tuy nhiên chúng ta cũng nhìn vào khối catch thứ ba:catch{Console.WriteLine(Some other exception has occurred);}Đây là khối catch chung cho tất cả - nó không nhận bất kì thông số nào . lýdo của khối block này là bắt các biệt lệ được ném bởi những đoạn mã khôngđược viết trong C#, hoặc thậm chí không được quản lí trong C#. như bạnthấy, đó là một sự đòi hỏi của ngôn ngữ C# mà chỉ thực thể của lớp đượcdẫn xuất từ system.exception mới có thể ném như một biệt lệ.nhưng nhữngngôn ngữ khác không có giới hạn này- ví dụ C++ cho phép bất kì một biếnnào được ném như là một biệt lệ.nếu mã của ta gọi trong thư viện hay nhữngtập hợp mà được viết trong những ngôn ngữ khác ,sau đó nó có thể t ìm mộtbiệt lệ được ném mà không dẫn xuất từ system.exception , mặc dù trongnhiều trường hợp , cơ chế của .NET sẽ bẫy những biệt lệ này và chuyểnchúng thành đối tượng biệt lệ .NET. tuy nhiên không có nhiều khối catch cóthể làm điều này, bởi vì chúng ta không biết những lớp biệt lệ nào có thểtrình bày .Bây giờ ta sẽ chạy đoạn mã ví dụ mà ta đả phân tích .minh họa cho nhữngtình huống nhập khác nhau xảy ra.và cả việc IndexOutOfRangeExceptionvà FormatException được ném:SimpleExceptionsInput a number between 0 and 5 (or just hit return to exit)> 4Your number was 4Thank youInput a number between 0 and 5 (or just hit return to exit)> 0Your number was 0Thank youInput a number between 0 and 5 (or just hit return to exit)> 10Exception: Number should be between 0 and 5. You typed in 10Thank youInput a number between 0 and 5 (or just hit return to exit)> helloAn exception was thrown. Message was: Input string was not in a correctformat.Thank youInput a number between 0 and 5 (or just hit return to exit)>Thank youĐón bắt ...

Tài liệu được xem nhiều: