Những đối tượng ngoại lệ trong csharp

c-sharp

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

Cho đến lúc này thì chúng ta có thể sử dụng tốt các ngoại lệ cũng như cách xử lý khắc phục các ngoại lệ này. Trong phần này chúng ta sẽ tiến hành việc tìm hiểu các đối tượng được xây dựng cho việc xử lý ngoại lệ. Đối tượng System.Exception cung cấp một số các phương thức và thuộc tính hữu dụng. Thuộc tính Message cung cấp thông tin về ngoại lệ, như là lý do tại sao ngoại lệ được phát sinh. Thuộc tính Message là thuộc tính chỉ đọc, đoạn chương trình phát sinh ngoại lệ có thể thiết lập thuộc tính Message như là một đối mục cho bộ khởi dựng của ngoại lệ. Thuộc tính HelpLink cung cấp một liên kết để trợ giúp cho các tập tin liên quan đến các ngoại lệ. Đây là thuộc tính chỉ đọc. Thuộc tính StackTrace cũng là thuộc tính chỉ đọc và được thiết lập bởi CLR. Trong ví dụ 13.6 thuộc tính Exception.HelpLink được thiết lập và truy cập để cung cấp thông tin cho người sử dụng về ngoại lệ DivideBy-ZeroException.

Thuộc tính StackTrace của ngoại lệ được sử dụng để cung cấp thông tin stack cho câu lệnh lỗi. Một thông tin stack cung cấp hàng loạt các cuộc gọi stack của phương thức gọi mà dẫn đến những ngoại lệ được phát sinh.

Ví dụ 13.6: Làm việc với đối tượng ngoại lệ.

namespace Programming_CSharp
{
	using System;
	public class Test
	{
		public static void Main()
		{
			Test t = new Test();
			t.TestFunc();
		}
		
		// chia hai số và xử lý ngoại lệ
		public void TestFunc()
		{
			try
			{
				Console.WriteLine(“Open file here”);
				double a = 12;
				double b = 0;
				Console.WriteLine(“{0} /{1} = {2}”, a, b, DoDivide(a,b));
				Console.WriteLine(“This line may or not print”);
			}
			catch (System.DivideByZeroException e)
			{
				Console.WriteLine(“\nDivideByZeroException! Msg: {0}”, e.Message);
				Console.WriteLine(“\nHelpLink: {0}”, e.HelpLink);
				Console.WriteLine(“\nHere’s a stack trace: {0}\n”, e.StackTrace);
			}
			catch
			{
				Console.WriteLine(“Unknown exception caught”);
			}
		}

		// thực hiện phép chia hợp lệ
		public double DoDivide( double a, double b)
		{
			if ( b == 0)
			{
				DivideByZeroException e = new DivideByZeroException();
				e.HelpLink = “https://meotinhoc.vn/”;
				throw e;
			}
			
			if ( a == 0)
			{
				throw new ArithmeticException();
			}
			return a/b;
		}
	}
}

Kết quả:

Open file here
DivideByZeroExceptión Msg: Attempted to divide by zero
HelpLink: https://meotinhoc.vn/
Here’s a stack trace:
at Programming_CSharp.Test.DoDivide(Double c, Double b)
in c:\...exception06.cs: line 56
at Programming_CSharp.Test.TestFunc() in ...exception06.cs: line 22.
Close file here

Trong đoạn kết quả trên, danh sách trace của stack được hiển thị theo thứ tự ngược lại thứ tự gọi. Nó hiển thị một lỗi trong phương thức DoDivde(), phương thức này được gọi từ phương thức TestFunc(). Khi các phương thức gọi lồng nhau nhiều cấp, thông tin stack có thể giúp chúng ta hiểu thứ tự của các phương thức được gọi.

Trong ví dụ này, hơn là việc đơn giản phát sinh một DidiveByZeroException, chúng ta tạo một thể hện mới của ngoại lệ:

DivideByZeroException e = new DivideByZeroException();

Chúng ta không truyền vào thông điệp của chúng ta, nên thông điệp mặc định sẽ được in ra:

DivideByZeroException! Msg: Attemped to divide by zero.

Ở đây chúng ta có thể bổ sung như dòng lệnh bên dưới để truyền vào thông điệp của chúng ta tùy chọn như sau:

new DivideByZeroException(“You tried to divide by zero which is not meaningful”);

Trước khi phát sinh ra ngoại lệ, chúng ta thiết lập thuộc tính HelpLink như sau:

e.HelpLink = “https://meotinhoc.vn/”;

Khi ngoại lệ được bắt giữ, chương trình sẽ in thông điệp và HelpLink ra màn hình:

catch (System.DivideByZeroException e)
{
	Console.WriteLine(“\nDivideByZeroException! Msg: {0}”, e.Message);
	Console.WriteLine(“\nHelpLink: {0}”, e.HelpLink);
}

Việc làm này cho phép chúng ta cung cấp những thông tin hữu ích cho người sử dụng. Thêm
vào đó thông tin stack cũng được đưa ra bằng cách sử dụng thuộc tính StackTrace của đối
tượng ngoại lệ:

Console.WriteLine(“\n Here’s a stack trace: {0}\n”, e.StackTrace);

Kết quả là các vết trong stack sẽ được xuất ra:

Here’s a stack trace:
at Programming_CSharp.Test.DoDivide(Double c, Double b)
in c:\...exception06.cs: line 56
at Programming_CSharp.Test.TestFunc() in ...exception06.cs: line 22.

Lưu ý rằng, phần đường dẫn được viết tắt, do đó kết quả của bạn có thể hơi khác một tí.

Bảng 13.1 sau mô tả một số các lớp ngoại lệ chung được khai báo bên trong namespace System.

CÁC LỚP NGOẠI LỆ, Tên ngoại lệ - Mô tả (Các ngoại lệ thường xuất hiện)

MethodAccessException
Lỗi truy cập, do truy cập đến thành viên hay phương thức không được truy cập

ArgumentException
Lỗi tham số đối mục

ArgumentNullException
Đối mục Null, phương thức được truyền đối mục null không được chấp nhận

ArithmeticException
Lỗi liên quan đến các phép toán

ArrayTypeMismatchException
Kiểu mảng không hợp, khi cố lưu trữ kiểu không thích hợp vào mảng

DivideByZeroException
Lỗi chia zero

FormatException
Định dạng không chính xác một đối mục nào đó

IndexOutOfRangeException
Chỉ số truy cập mảng không hợp lệ, dùng nhỏ hơn chỉ số nhỏ nhất hay lớn hơn chỉ số lớn nhất của mảng

InvalidCastException
Phép gán không hợp lệ

MulticastNotSupportedException
Multicast không được hỗ trợ, do việc kết hợp haidelegate không đúng

NotFiniteNumberException
Không phải số hữu hạn, số không hợp lệ

NotSupportedException
Phương thức không hỗ trợ, khi gọi một phương thức không tồn tại bên trong lớp.

NullReferenceException
Tham chiếu null không hợp lệ.

OutOfMemoryException
Out of memory

OverflowException
Lỗi tràn phép toán

StackOverflowException
Tràn stack

TypeInitializationException
Kiểu khởi tạo sai, khi bộ khởi dựng tĩnh có 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?