Những chủ đề tiến bộ trong C#
Lỗi và xử lí biệt lệ - Phn 2
Gisử rằng người sử dụng gõ 1 smà 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 y máy tính s ngay lp tức thoát khi khối try và
tìm khi catch mà xIndexOutOfRangeException. khối catch đầu tiên
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 ly 1 thông scủ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 y,1 thông báo lỗi và thuộc tính exception.message (đáp li
chuỗi chúng ta đã truyn đến hàm dựng của IndexOutOfRange).sau khi
thực thi khối catch này , điều khiển chuyển đến khối finally, như là kng có
biệt lệ nào xuất hiện.
Chú ý rng 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 khả ng xử IndexOutOfRangeException nếu
không skiệ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 sở có thể cũng chuyển đến bất k1 thể hiện của mộ
lớp dẫn xuất từ nó.và tất cbiệt lệ mà dn xuất từ system.exception . vậy tại
sao khối catch này không được thực thi? câu trả li là máy tính chthực thi
khối catch thích hợp đầu tiên tìm thấy. vy tại sao khối catch thứ hai
này li nằm đây ? thật ra thì không chđoạn của ta mi được bao phủ
bởi khối try ,mà bên trong khi, chúng ta thực sgọi những phương thức
riêng biệt nhau trong namspace system ( Console.ReadLine(),
Console.Write(), and Convert.ToInt32()), 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ì kng phi là s- say hoặc hello ,sau đó phương
thức convert.toin32() sẽ ném ra một biệt lệ của lớp
System.FormatException, để chỉ định chuỗi được truyền vào toin32() không
nằm trong định dạng mà thchuyển thành kiu int. khi điều này xy ra,
máy tính struy vết xuyên suốt phương thức gi , tìm hàm xmà th
x biệt lệ này. khối catch đầu tiên của chúng ta ( i mà bt
IndexOutOfRangeException) s không thực hiện.máy tính tìm đến i thứ
hai.cái này s thi hành bi vì FormatException là một dẫn xuất texception,
vậy một thực thể FormatException thể được truyền như một thông
số ở đây.
Cấu trúc của d trên thực sự là kiểu tình hung đẹp vi nhiều khối
catch.chúng ta sbắt đầu vi khối catch được thiết kế để bẫy trạng thái lỗi
cụ thể. sau đó, chúng ta hoàn thành với nhiều khối catch sẽ bao phủ bất kì li
nào mà chúng ta không viết những hàm xlỗi cthể.việc sắp xếp các khối
catch là quan trọng.nếu chúng ta viết tên 2 khối thứ tngượ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ể được
tham 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 - không nhận bất kì thông snào .
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 c không được quản trong C#. như bạn
thấy, đó là một sự đòi hỏi của ngôn ngữ C# mà chthực thể của lớp được
dẫn xuất tsystem.exception mi thể ném như một biệt lệ.nhưng những
ngôn ngkhác không giới hn này- d C++ cho phép bất kì một biến
nào được m như một biệt lệ.nếu mã của ta gọi trong tviện hay những
tập hợp được viết trong những ngôn ngkhác ,sau đó thể tìm một
biệt lệ được m mà không dn xuất từ system.exception , mặc dù trong
nhiều trường hợp , cơ chế ca .NET s bẫy những biệt lệ này chuyn
chúng thành đối tượng biệt l .NET. tuy nhiên không có nhiều khối catch
thm điều này, bởi vì chúng ta kng biết những lp biệt lệ nào th
trình bày .
Bây gi ta schạy đoạn mã dta đ phân tích .minh họa cho những
tình huống nhập khác nhau xảy ra.và c việc IndexOutOfRangeException
FormatException được ném:
SimpleExceptions
Input a number between 0 and 5 (or just hit return to exit)> 4
Your number was 4
Thank you
Input a number between 0 and 5 (or just hit return to exit)> 0
Your number was 0
Thank you
Input a number between 0 and 5 (or just hit return to exit)> 10
Exception: Number should be between 0 and 5. You typed in 10
Thank you
Input a number between 0 and 5 (or just hit return to exit)> hello
An exception was thrown. Message was: Input string was not in a correct
format.
Thank you
Input a number between 0 and 5 (or just hit return to exit)>