Phát sinh và bắt giữ ngoại lệ, Câu lệnh throw trong csharp

c-sharp

(Phạm Quyết Nghị) #1

Trong ngôn ngữ C#, chúng ta chỉ có thể phát sinh (throw) những đối tượng các kiểu dữ liệu là System.Exception, hay những đối tượng được dẫn xuất từ kiểu dữ liệu này. Namespace System của CLR chứa một số các kiểu dữ liệu xử lý ngoại lệ mà chúng ta có thể sử dụng trong chương trình. Những kiểu dữ liệu ngoại lệ này bao gồm ArgumentNullException, InValidCastException, và OverflowException, cũng như nhiều lớp khác nữa.

Câu lệnh throw

Để phát tín hiệu một sự không bình thường trong một lớp của ngôn ngữ C#, chúng ta phát sinh một ngoại lệ. Để làm được điều này, chúng ta sử dụng từ khóa throw. Dòng lệnh sau tạo ra một thể hiện mới của System.Exception và sau đó throw nó:

throw new System.Exception();

Khi phát sinh ngoại lệ thì ngay tức khắc sẽ làm ngừng việc thực thi trong khi CLR sẽ tìm kiếm một trình xử lý ngoại lệ. Nếu một trình xử lý ngoại lệ không được tìm thấy trong phương thức hiện thời, thì CLR tiếp tục tìm trong phương thức gọi cho đến khi nào tìm thấy. Nếu CLR trả về lớp Main() mà không tìm thấy bất cứ trình xử lý ngoại lệ nào, thì nó sẽ kết thúc chương trình.

Ví dụ 13.1: Throw ngoại lệ.

namespace Programming_CSharp
{
	using System;
	public class Test
	{
		public static void Main()
		{
			Console.WriteLine(“Enter Main....”);
			Test t = new Test();
			t.Func1();
			Console.WriteLine(“Exit Main...”);
		}
		
		public void Func1()
		{
			Console.WriteLine(“Enter Func1...”);
			Func2();
			Console.WriteLine(“Exit Func1...”);
		}
		
		public void Func2()
		{
			Console.WriteLine(“Enter Func2...”);
			throw new System.Exception();
			Console.WriteLine(“Exit Func2...”);
		}
	}
}

Kết quả:

Enter Main....
Enter Func1...
Enter Func2...
Exception occurred: System.Exception: An exception of type System.Exception
was throw.
at Programming_CSharp.Test.Func2() in ... exception01.cs:line 26
at Programming_CSharp.Test.Func1() in ... exception01.cs:line 20
at Programming_CSharp.Test.Main() in ... exception01.cs:line 12

Ví dụ minh họa đơn giản này viết ra màn hình console thông tin khi nó nhập vào trong một hàm và chuẩn bị đi ra từ một hàm. Hàm Main() tạo thể hiện mới của kiểu Test và sau đó gọi hàm Func1(). Sau khi in thông điệp “Enter Func1”, hàm Func1() này gọi hàm Func2(). Hàm Func2() in ra thông điệp đầu tiên và phát sinh một ngoại lệ kiểu System.Exception. Việc thực thi sẽ ngưng ngay tức khắc, và CLR sẽ tìm kiếm trình xử lý ngoại lệ trong hàmFunc2(). Do không tìm thấy ở đây, CLR tiếp tục vào stack lấy hàm đã gọi trước tức là Func1 và tìm kiếm trình xử lý ngoại lệ. Một lần nữa trong Func1 cũng không có đoạn xử lý ngoại lệ. Và CLR trả về hàm Main. Tại hàm Main cũng không có, nên CLR sẽ gọi trình mặc định xử lý ngoại lệ, việc này đơn giản là xuất ra một thông điệp lỗi.


Tài liệu c# tiếng việt cho người mới bắt đầu (newbie)

89% Thành viên có cách giải cho một câu hỏi. Bạn thì sao?