Xử lý ngoại lệ với Exception
Giới thiệu ngoại lệ (Exception)
Một ngoại lệ là một vấn đề xuất hiện trong khi thực thi một chương trình. Một ngoại lệ trong C# là một phản hồi về một tình huống xuất hiện ngoại lệ trong khi một chương trình đang chạy, ví dụ như chia cho số 0.
Ngoại lệ cung cấp một cách để truyền điều khiển từ một phần của một chương trình tới phần khác. Exception Handling (Xử lý ngoại lệ) trong C# được xây dựng dựa trên 4 từ khóa là: try
, catch
, finally
, và throw
.
try
: Một khốitry
nhận diện một khối code mà ở đó các exception cụ thể được kích hoạt. Nó được theo sau bởi một hoặc nhiều khốicatch
.catch
: Một chương trình bắt một Exception với một Exception Handler tại vị trí trong một chương trình nơi bạn muốn xử lý vấn đề đó. Từ khóacatch
trong C# chỉ dẫn việc bắt một exception.finally
: Một khốifinally
được sử dụng để thực thi một tập hợp lệnh đã cho, dù có hay không một exception đươc ném hoặc không được ném. Ví dụ, nếu bạn mở một file, nó phải được đóng, nếu không sẽ có một exception được tạo ra.throw
: Một chương trình ném một exception khi có một vấn đề xuất hiện. Điều này được thực hiện bởi sử dụng từ khóathrow
trong C#.
Giả sử một khối tạo một Exeption, một phương thức bắt một exception bởi sử dụng kết hợp các từ khóa try và catch. Một khối try/catch được đặt xung quanh code mà có thể tạo một exception. Code bên trong một khối try/catch được xem như là code được bảo vệ, và cú pháp để sử dụng try/catch trong C# như sau:
try { // statements causing exception } catch( ExceptionName e1 ) { // error handling code } catch( ExceptionName e2 ) { // error handling code } catch( ExceptionName eN ) { // error handling code } finally { // statements to be executed }
Các lớp xử lý ngoại lệ trong C#
Các ngoại lệ trong C# được biểu diễn bởi các lớp xây dựng sẵn trong thư viện .NET Frameworks. Các lớp ngoại trong C# chủ yếu được kế thừa một cách trực tiếp hoặc không trực tiếp từ lớp System.Exception
. Một số lớp Exception kế thừa từ lớp System.Exception
là các lớp System.ApplicationException
và System.SystemException
.
Lớp System.ApplicationException
hỗ trợ các exception được tạo bởi các chương trình ứng dụng. Vì thế, các exception được định nghĩa bởi lập trình viên nên kế thừa từ lớp này.
Lớp System.SystemException
là lớp cơ sở cho tất cả system exception tiền định nghĩa.
Bảng sau cung cấp một số lớp Exception tiền định nghĩa được kế thừa từ lớp Sytem.SystemException
trong C#:
LỚP | MÔ TẢ |
---|---|
System.IO.IOException | Xử lý các lỗi I/O |
System.IndexOutOfRangeException | Xử lý các lỗi được tạo khi một phương thức tham chiếu tới một chỉ mục bên ngoài dãy mảng |
System.ArrayTypeMismatchException | Xử lý các lỗi được tạo khi kiểu là không phù hợp với kiểu mảng |
System.NullReferenceException | Xử lý các lỗi được tạo từ việc tham chiếu một đối tượng null |
System.DivideByZeroException | Xử lý các lỗi được tạo khi chia cho số 0 |
System.InvalidCastException | Xử lý lỗi được tạo trong khi ép kiểu |
System.OutOfMemoryException | Xử lý lỗi được tạo từ việc thiếu bộ nhớ rỗi |
System.StackOverflowException | Xử lý lỗi được tạo từ việc tràn ngăn xếp (stack) |
Xử lý ngoại lệ
C# cung cấp một giải pháp mang tính cấu trúc cao để xử lý ngoại lệ trong form các khối try và catch. Sử dụng các khối này, các lệnh chương trình được phân biệt riêng rẽ với các lệnh xử lý ngoại lệ trong C#.
Những khối xử lý ngoại lệ này được triển khai bởi sử dụng các từ khóa try, catch và finallytrong C#. Ví dụ ExceptionDemo sau đây sẽ minh hoạ cách xử lý ngoại lệ trong một chương trình C#:
Tạo ngoại lệ do người dùng định nghĩa
Bạn cũng có thể định nghĩa ngoại lệ và cơ chế xử lý ngoại lệ đó thông qua CustomExceptionDemo sau:
Ném ra đối tượng ngoại lệ
Bạn có thể ném một đối tượng ngoại lệ nếu nó: hoặc trực tiếp hoặc gián tiếp được kế thừa từ lớp System.Exception
trong C#. Bạn có thể sử dụng một lệnh throw
trong khối catch
để ném đối tượng hiện diện đó:
catch(Exception e) { ... throw e
}