XỬ LÝ NGOẠI LỆ TRONG C#
Ngoại lệ là gì? Là những tình huống xảy ra mà sẽ làm cho chương trình của chúng ta bị văng lúc run-time.Ví dụ: giả sử, đâu đó trong chương trình, chúng ta có 1 phép chia cho 0 --> Văng, hoặc là nhập 1 số nguyên, mà ta lại chơi 1 chữ a --> Văng….
Các bạn hãy xem đoạn code này:
- Code:
-
class Test
{
static void Main()
{
int a;
a = int.Parse(System.Console.ReadLine());
System.Console.WriteLine("a = " + a);
System.Console.ReadLine();
}
}
Nếu chúng ta nhập vào 1 số --> bình thường.
Nếu chúng ta nhập vào 1 hoặc vài ký tự linh tinh, chúng ta sẽ có thông báo sau:
- Code:
-
Input string was not in a correct format.
Nghĩa là IDE đã phát hiện và ném ra 1 ngoại lệ kiểu Format --> Văng
Vậy làm sao để cho chương trình của chúng ta không văng?
Chúng ta phải bắt lấy nó, xử lý, và nói là IDE bỏ qua cho.
Bằng cách: sử dụng try … catchCách sử dụng: các bạn xem đoạn chương trình sau, xem tôi kiểm soát lỗi này thế nào?
- Code:
-
using System;
class Test
{
static void Main()
{
int a;
try
{
a = int.Parse(Console.ReadLine());
Console.WriteLine("a = " + a);
}
catch (FormatException e)
{
Console.WriteLine("Loi: " + e.Message);
}
System.Console.ReadLine();
}
}
Đoạn chương trình trên, tôi đã sử dụng 2 khối: try và catch.
Khối try: là khối những công việc mà ta muốn làm, mà lại nghi ngờ có xảy ra ngoại lệ trong đó.
Khối catch: là khối mà ta sẽ xử lý nếu có ngoại lệ xảy ra.
Trong đoạn chương trình trên, nếu bạn nhập 1 số, thì khối try sẽ làm hết, khối catch không làm gì hết. Nhưng nếu bạn nhập 1 chữ chẳng hạn, thì khối catch sẽ vào cuộc.
Để ý dòng này:
- Code:
-
FormatException e
Nghĩa là ta đang đón bắt cái lỗi Format.
Nếu chúng ta không biết trước được lỗi gì sẽ xảy ra, ta nên dùng : Exception e
Với chú này, thì anh ngoại lệ nào cũng ko thể thoát được. Hehe!
Thêm 1 vấn đề, nếu trong khối try, ta có nhiều trường hợp gây lỗi? Ví dụ vừa chia cho 0, vừa nhập số cho kiểu int, hay tràn chỉ số.
Cách giải quyết, ta chỉ cần khai báo nhiều khối catch để túm chúng thôi.
Hãy xem đoạn này:
- Code:
-
using System;
class Test
{
static void Main()
{
int a;
try
{
Console.WriteLine("Nhap a: ");
a = int.Parse(Console.ReadLine());
Console.WriteLine("a = " + a);
int c = 12 / a;
Console.WriteLine("c = " + c);
}
catch (FormatException e)
{
Console.WriteLine("Loi: " + e.Message);
}
catch (DivideByZeroException e)
{
Console.WriteLine("Loi: " + e.Message);
}
System.Console.ReadLine();
}
}
Trong đoạn này, có đến 2 trường hợp có thể gây lỗi, nếu ta nhập chữ, thì y trường hợp ở trên, nếu ta nhập 0, ta có ngoại lệ chia cho 0, và tôi đã dùng anh DivideByZeroException để bắt.
Vậy là tạm ổn với 2 khối try.. catch
Giờ tiếp theo là đến khối finnaly:Nhiệm vụ: thực hiện các việc còn lại, cho dù có hay không có ngoại lệ, thì khối này vẫn làm việc. chúng ta không thể sử dụng các từ khóa điều khiển trong đây, ví dụ: break, return.
Hãy xem ví dụ để xem khối này làm việc ra sao.
- Code:
-
using System;
class Test
{
static void Main()
{
int a;
try
{
Console.WriteLine("Nhap a: ");
a = int.Parse(Console.ReadLine());
Console.WriteLine("a = " + a);
int c = 12 / a;
Console.WriteLine("c = " + c);
}
catch (FormatException e)
{
Console.WriteLine("Loi: " + e.Message);
}
catch (DivideByZeroException e)
{
Console.WriteLine("Loi: " + e.Message);
}
finally
{
Console.WriteLine("Ket Thuc!");
}
System.Console.ReadLine();
}
}
Ta có thêm khối, finnaly, nó sẽ làm nhiệm vụ xuất ra cái câu Ket Thuc!, và luôn luôn như vậy.
Việc sử dụng khối này, thì phải tùy vào từng trường hợp thôi.
Hôm nay đến đây thôi, rảnh làm tiếp phần throw.Ai có thắc mắc hoặc ý kiến hay thì xin commnent tại đây!
Cám ơn!