Xử lý ngoại lệ (Exception Handling) trong C#

Xử lý ngoại lệ C# là cơ chế được tích hợp sẵn trong NET framework để phát hiện và xử lý các lỗi runtime. C# cung cấp 3 từ khóa try, catch và finally. Để tìm hiểu chi tiết về xử lý ngoại lệ (Exception Handling) trong C#, bạn đọc cùng tham khảo tiếp bài viết dưới đây của Taimienphi.vn.

Xử lý ngoại lệ (Exception Handling) trong C#
 

Mục Lục bài viết:
1. Xử lý ngoại lệ (Exception Handling) trong C#.
2. Uncaught Exception.
3. Khối catch trong C#.
4. Bắt tất cả ngoại lệ trong C#.
5. Ném một ngoại lệ.
6. Ném lại một ngoại lệ.
7. Các ngoại lệ chuẩn trong C#.
8. Ngoại lệ do người dùng định nghĩa.

1. Xử lý ngoại lệ (Exception Handling) trong C#

Như Taimienphi.vn vừa đề cập ở trên, xử lý ngoại lệ là cơ chế được tích hợp sẵn trong .NET framework để phát hiện và xử lý các lỗi runtime. .NET framework có chứa nhiều ngoại lệ chuẩn.

Các ngoại lệ là các bất thường, xảy ra trong quá trình thực thi chương trình, nó có thể là lỗi người dùng, lỗi logic hoặc lỗi hệ thống. Nếu người dùng (lập trình viên) không cung cấp cơ chế xử lý các bất thường này, môi trường runtime .NET sẽ cung cấp cơ chế mặc định, chấm dứt việc thực thi chương trình.

C# cung cấp 3 từ khóa, bao gồm try, catch và finally để xử lý ngoại lệ. Trong đó từ khóa try bao gồm các lệnh có thể đưa ra ngoại lệ, catch xử lý một ngoại lệ nếu nó tồn tại và finally được sử dụng để thực hiện quá trình dọn dẹp bất kỳ.

Dưới đây là cấu trúc chung của các từ khóa try - catch - finally trong C#:

Nếu có bất kỳ ngoại lệ nào xảy ra trong khối try, control sẽ chuyển sang khối catch và sau đó đến khối finally.

Tuy nhiên trong C#, cả khối catch và khối finally đều là tùy chọn. Khối try có thể tồn tại cùng một hoặc nhiều khối catch hoặc khối finally, hoặc có thể tồn tại cùng cả 2 khối catch và finally.

Nếu không có ngoại lệ xảy ra trong khối try, control sẽ chuyển qua trực tiếp khối finally. Các câu lệnh bên trong khối finally luôn luôn được thực thi. Lưu ý lỗi xảy ra khi chuyển control ra khỏi khối finally bằng cách sử dụng break, continue, return hoặc goto.

Trong C#, ngoại lệ là các đối tượng thuộc kiểu Exception. Exception là cơ sở cho các ngoại lệ bất kỳ trong C#.

C# cung cấp một số ngoại lệ chuẩn, tuy nhiên nếu muốn người dùng có thể tạo các lớp ngoại lệ riêng của mình, miễn là các lớp ngoại lệ này được kế thừa từ lớp Exception hoặc một trong số các lớp dẫn xuất chuẩn của lớp Exception, như DivideByZeroExcpetion hay ArgumentException, ... .

2. Uncaught Exception

Chương trình dưới đây biên dịch nhưng sẽ hiển thị lỗi trong quá trình thực thi. Việc chia cho 0 là bất thường và chương trình sẽ kết thúc với thông báo lỗi.

Uncaught exception bất kỳ trong context propagate hiện tại đến higher context tìm kiếm khối catch phù hợp để xử lý nó. Nếu không tìm thấy khối catch phù hợp nào, cơ chế mặc định của .NET runtime sẽ chấm dứt việc thực thi toàn bộ chương trình.

Chương trình sau khi sửa đổi với cơ chế xử lý ngoại lệ có dạng như dưới đây. Ở đây chúng ta sử dụng đối tượng của lớp ngoại lệ chuẩn DivideByZeroException để xử lý ngoại lệ chia cho số 0.

Kết quả trả về từ đoạn mã trên có dạng như dưới đây:

Trong ví dụ trên, chương trình không kết thúc, thay vào đó control chuyển từ vị trí xảy ra ngoại lệ bên trong khối try sang khối block. Nếu tìm thấy bấy kỳ khối catch phù hợp nào, quá trình thực thi các lệnh bên trong khối catch sẽ tiếp tục thực thi. Nếu khối finally xuất hiện, mã bên trong khối finally sẽ được thực thi.

Một lưu ý nhỏ là trong C#, khối catch là tùy chọn. Chương trình dưới đây là một chương trình hợp lệ trong C#:

Tuy nhiên trong trường hợp này không có xử lý ngoại lệ khối catch nên việc thực thi sẽ bị kết thúc. Trước khi kết thúc, các lệnh chương trình bên trong khối finally sẽ được thực thi. Trong C#, khối try phải được theo sau khối catch hoặc khối finally.

3. Khối catch trong C#

Một khối try có thể ném nhiều ngoại lệ mà chúng ta có thể xử lý bằng cách sử dụng nhiều khối catch. Một lưu ý là khối catch chuyên dụng sẽ đứng trước khối catch tổng quát, nếu không trình biên dịch sẽ hiển thị một lỗi biên dịch.

4. Bắt tất cả ngoại lệ trong C#

Bằng cách cung cấp khối catch mà không có dấu ngoặc vuông hoặc đối số, chúng ta có thể bắt tất cả ngoại lệ xảy tra trong khối try.

Hoặc ngoài ra chúng ta có thể sử dụng khối catch với tham số kiểu Exception để bắt tất cả các ngoại lệ xảy ra bên trong khối try, vì trong C# tất cả các ngoại lệ đều được kế thừa trực tiếp hoặc gián tiếp từ lớp Exception (ngoại lệ).

Chương trình dưới đây minh họa cách xử lý tất cả các ngoại lệ với đối tượng Exception.

5. Ném một ngoại lệ

C# có thể ném một ngoại lệ theo chương trình. Để ném một ngoại lệ trong C# chúng ta sử dụng từ khóa "throw". Cấu trúc ném một ngoại lệ trong C# có dạng như dưới đây:

throw exception_obj;

Ví dụ, các lệnh dưới đây ném một ngoại lệ ArgumentException:

6. Ném lại một ngoại lệ

Các ngoại lệ mà chúng ta bắt được trong khối catch có thể ném lại vào higher context bằng cách sử dụng từ khóa throw bên trong khối catch.

Chương trình dưới đây minh họa cách ném lại một ngoại lệ trong C#:

7. Các ngoại lệ chuẩn trong C#

Trong C# có 2 kiểu ngoại lệ, là ngoại lệ được tạo bởi chương trình thực thi và ngoại lệ được tạo bởi runtime ngôn ngữ chung.

System.Exception là lớp cơ sở cho tất cả ngoại lệ trong C#. Một số lớp ngoại lệ kế thừa từ lớp System.Exception bao gồm ApplicationException và SystemException. 2 lớp này là cơ sở cho hầu hết các ngoại lệ runtime khác. Một số ngoại lệ khác kế thừa từ System.Exception bao gồm IOException, WebException, ... .

Runtime ném ngoại lệ SystemException. ApplicationException được ném bởi chương trình người dùng nhiều hơn là runtime. SystemException bao gồm ExecutionEngineException, StaclOverFlowException, ... .

- System.OutOfMemoryException
- System.NullReferenceException
- Syste.InvalidCastException
- Syste.ArrayTypeMismatchException
- System.IndexOutOfRangeException
- System.ArithmeticException
- System.DevideByZeroException
- System.OverFlowException

8. Ngoại lệ do người dùng định nghĩa

Trong C# chúng ta có thể tạo các lớp ngoại lệ riêng, nhưng Exception phải là lớp cơ sở cuối cùng cho tất cả các lớp ngoại lệ trong C#. Vì vậy các lớp ngoại lệ do người dùng định nghĩa phải kế thừa từ lớp Exception hoặc một trong số các lớp dẫn xuất chuẩn của Exception.

Như vậy bài viết trên đây Taimienphi.vn vừa giới thiệu cho bạn về xử lý ngoại lệ (Exception Handling) trong C#. Nếu một ngoại lệ được định nghĩa trước trong namespace System mô tả điều kiện ngoại lệ, ngoại lệ này sẽ có ý nghĩa với lớp. Cuối cùng, nếu mã bắt được một ngoại lệ nhưng không xử lý, bạn có thể xem xét xem có thể bọc ngoại lệ đó với thông tin bổ sung trước khi ném lại không. Để biết thêm về C#, các bạn tìm hiểu File I/O trong C# là gì nhé.

Trong các bài học C# trước chúng ta đã tìm hiểu về chỉ thị tiền xử lý (Preprocessor Directive) cũng như biểu thức chính quy (Regular Expression) trong C# là gì. Bài viết tiếp theo dưới đây Taimienphi.vn sẽ giới thiệu tiếp cho bạn về xử lý ngoại lệ (Exception Handling) trong C# là gì nhé.
Number trong C++
Biểu thức chính quy (Regular Expression) trong C#
File I/O trong C# là gì?
Cài đặt môi trường C
Cú pháp C# cơ bản
Namespace trong C# là gì?

ĐỌC NHIỀU