C # - Xử lý ngoại lệ
Một ngoại lệ là một vấn đề phát sinh trong quá trình thực hiện một chương trình. Ngoại lệ AC # là phản hồi cho một trường hợp ngoại lệ phát sinh trong khi chương trình đang chạy, chẳng hạn như nỗ lực chia cho không.
Ngoại lệ cung cấp một cách để chuyển quyền kiểm soát từ một phần của chương trình sang phần khác. Xử lý ngoại lệ C # được xây dựng dựa trên bốn từ khóa:try, catch, finallyvà throw.
try- Khối try xác định một khối mã mà các ngoại lệ cụ thể được kích hoạt. Theo sau nó là một hoặc nhiều khối bắt.
catch- Một chương trình bắt một ngoại lệ với một trình xử lý ngoại lệ tại vị trí trong một chương trình mà bạn muốn xử lý vấn đề. Từ khóa catch cho biết việc bắt một ngoại lệ.
finally- Khối cuối cùng được sử dụng để thực hiện một tập hợp các câu lệnh đã cho, cho dù một ngoại lệ được ném hay không được ném. Ví dụ: nếu bạn mở một tệp, nó phải được đóng lại cho dù có một ngoại lệ nào được đưa ra hay không.
throw- Một chương trình ném ra một ngoại lệ khi một vấn đề xuất hiện. Điều này được thực hiện bằng cách sử dụng một từ khóa ném.
Cú pháp
Giả sử một khối tạo ra một ngoại lệ, một phương pháp sẽ bắt một ngoại lệ bằng cách sử dụng kết hợp các từ khóa try and catch. Một khối try / catch được đặt xung quanh mã có thể tạo ra một ngoại lệ. Mã trong khối try / catch được gọi là mã được bảo vệ và cú pháp để sử dụng try / catch trông giống 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
}
Bạn có thể liệt kê nhiều câu lệnh bắt để bắt các loại ngoại lệ khác nhau trong trường hợp khối try của bạn tạo ra nhiều hơn một ngoại lệ trong các tình huống khác nhau.
Các lớp ngoại lệ trong C #
Các ngoại lệ của C # được đại diện bởi các lớp. Các lớp ngoại lệ trong C # chủ yếu được dẫn xuất trực tiếp hoặc gián tiếp từSystem.Exceptionlớp học. Một số lớp ngoại lệ bắt nguồn từ lớp System.Exception làSystem.ApplicationException và System.SystemException các lớp học.
Các System.ApplicationExceptionlớp hỗ trợ các ngoại lệ do các chương trình ứng dụng tạo ra. Do đó, các ngoại lệ được định nghĩa bởi các lập trình viên nên bắt nguồn từ lớp này.
Các System.SystemException lớp là lớp cơ sở cho tất cả ngoại lệ hệ thống được xác định trước.
Bảng sau cung cấp một số lớp ngoại lệ được xác định trước có nguồn gốc từ lớp Sytem.SystemException -
Sr.No. | Lớp ngoại lệ & Mô tả |
---|---|
1 | System.IO.IOException Xử lý lỗi I / O. |
2 | System.IndexOutOfRangeException Xử lý các lỗi được tạo ra khi một phương thức tham chiếu đến một chỉ mục mảng nằm ngoài phạm vi. |
3 | System.ArrayTypeMismatchException Xử lý các lỗi được tạo ra khi kiểu không khớp với kiểu mảng. |
4 | System.NullReferenceException Xử lý các lỗi được tạo ra từ việc tham chiếu đến một đối tượng rỗng. |
5 | System.DivideByZeroException Xử lý các lỗi tạo ra từ việc chia cổ tức bằng 0. |
6 | System.InvalidCastException Xử lý các lỗi phát sinh trong quá trình đánh máy. |
7 | System.OutOfMemoryException Xử lý các lỗi phát sinh do không đủ bộ nhớ trống. |
số 8 | System.StackOverflowException Xử lý các lỗi tạo ra từ tràn ngăn xếp. |
Xử lý ngoại lệ
C # cung cấp một giải pháp có cấu trúc để xử lý ngoại lệ dưới dạng khối try và catch. Sử dụng các khối này, các câu lệnh chương trình cốt lõi được tách biệt với các câu lệnh xử lý lỗi.
Các khối xử lý lỗi này được triển khai bằng cách sử dụng try, catchvà finallytừ khóa. Sau đây là một ví dụ về việc ném một ngoại lệ khi điều kiện chia cho 0 xảy ra:
using System;
namespace ErrorHandlingApplication {
class DivNumbers {
int result;
DivNumbers() {
result = 0;
}
public void division(int num1, int num2) {
try {
result = num1 / num2;
} catch (DivideByZeroException e) {
Console.WriteLine("Exception caught: {0}", e);
} finally {
Console.WriteLine("Result: {0}", result);
}
}
static void Main(string[] args) {
DivNumbers d = new DivNumbers();
d.division(25, 0);
Console.ReadKey();
}
}
}
Khi đoạn mã trên được biên dịch và thực thi, nó tạo ra kết quả sau:
Exception caught: System.DivideByZeroException: Attempted to divide by zero.
at ...
Result: 0
Tạo ngoại lệ do người dùng xác định
Bạn cũng có thể xác định ngoại lệ của riêng mình. Các lớp ngoại lệ do người dùng xác định có nguồn gốc từExceptionlớp học. Ví dụ sau đây chứng minh điều này -
using System;
namespace UserDefinedException {
class TestTemperature {
static void Main(string[] args) {
Temperature temp = new Temperature();
try {
temp.showTemp();
} catch(TempIsZeroException e) {
Console.WriteLine("TempIsZeroException: {0}", e.Message);
}
Console.ReadKey();
}
}
}
public class TempIsZeroException: Exception {
public TempIsZeroException(string message): base(message) {
}
}
public class Temperature {
int temperature = 0;
public void showTemp() {
if(temperature == 0) {
throw (new TempIsZeroException("Zero Temperature found"));
} else {
Console.WriteLine("Temperature: {0}", temperature);
}
}
}
Khi đoạn mã trên được biên dịch và thực thi, nó tạo ra kết quả sau:
TempIsZeroException: Zero Temperature found
Ném đồ vật
Bạn có thể ném một đối tượng nếu nó có nguồn gốc trực tiếp hoặc gián tiếp từ System.Exceptionlớp học. Bạn có thể sử dụng câu lệnh ném trong khối catch để ném đối tượng hiện tại dưới dạng:
Catch(Exception e) {
...
Throw e
}