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
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 ...
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ìm kiếm theo từ khóa liên quan:
lập trình tài liệu lập trình kỹ thuật lập trình giáo trình C ngôn ngữ lập trình C tự học lập trình với CTài liệu liên quan:
-
Kỹ thuật lập trình trên Visual Basic 2005
148 trang 266 0 0 -
NGÂN HÀNG CÂU HỎI TRẮC NGHIỆM THIẾT KẾ WEB
8 trang 208 0 0 -
101 trang 200 1 0
-
Giới thiệu môn học Ngôn ngữ lập trình C++
5 trang 195 0 0 -
Bài giảng Nhập môn về lập trình - Chương 1: Giới thiệu về máy tính và lập trình
30 trang 169 0 0 -
Luận văn: Nghiên cứu kỹ thuật giấu tin trong ảnh Gif
33 trang 153 0 0 -
Tìm hiểu về ngôn ngữ lập trình C: Phần 1 - Quách Tuấn Ngọc
211 trang 149 0 0 -
Giáo trình Lập trình C căn bản - HanoiAptech Computer Education Center
136 trang 134 0 0 -
161 trang 130 1 0
-
Báo cáo thực tập Công nghệ thông tin: Lập trình game trên Unity
27 trang 119 0 0