Xử lý ngoại lệ trong C#

0
732

Một ngoại lệ là một vấn đề phát sinh trong quá trình thực hiện chương trình. Một ngoại lệ C # là một phản ứng với một trường hợp ngoại lệ phát sinh trong khi chương trình đang chạy, như một nỗ lực để chia cho số không.

Ngoại lệ cung cấp một cách để chuyển điều khiển từ một phần của chương trình sang chỗ khác. C # xử lý ngoại lệ được xây dựng dựa trên bốn từ khoá: try, catch, finally, and throw.

  • try: Một try xác định một khối mã mà trường hợp ngoại lệ đặc biệt được kích hoạt. Nó được theo sau bởi một hoặc nhiều hơn các khối catch.
  • catch: Một chương trình bắt một ngoại lệ với một ngoại lệ được xử lý tại chỗ. Từ khóa catch chỉ bắt một ngoại lệ.
  • finally: Khóa finally được sử dụng để thực hiện một tập hợp các báo cáo, cho dù một ngoại lệ được ném hoặc không ném. Ví dụ, nếu bạn mở một tập tin, nó phải được đongs cho dù một ngoại lệ xảy ra hay không.
  • throw: Một chương trình ném 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 từ khóa throw.

Cú pháp

Giả sử một khóa đặt ra một ngoại lệ, một phương thức bắt một ngoại lệ sử dụng sự kết hợp của các từ khóa trycatch. Một khóa try / catch được đặt xung quanh mã mà có thể tạo ra một ngoại lệ. Mã trong một khối try / catch được gọi tắt là mã bảo vệ, và cú pháp để sử dụng try / catch  giống như sau:

try
{
   // câu lệnh gây ra ngoại lệ
}
catch( Ten ngoai le e1 )
{
   // xử lý mã lỗi
}
catch( Ten ngoai le e2 )
{
   // xử lý mã lỗi
}
catch( Ten ngoai le eN )
{
   // xử lý mã lỗi
}
finally
{
   // báo cáo được thực hiện
}
Y

Bạn có thể liệt kê nhiều câu lệnh catch để bắt các trường hợp khác nhau trong trường hợp khối try của bạn có nhiều hơn một ngoại lệ.

Các lớp ngoại lệ trong C #

Trường hợp ngoại lệ được đại diện bởi các lớp. Các lớp ngoại lệ trong C # chủ yếu là trực tiếp hoặc gián tiếp có nguồn gốc từ lớp System.Exception. Một số các lớp ngoại lệ bắt nguồn từ lớp System.Exception là những lớp System.ApplicationException và System.SystemException.

Lớp System.ApplicationException hỗ trợ trường hợp ngoại lệ được tạo ra bởi các chương trình ứng dụng. Do đó các trường hợp ngoại lệ được định nghĩa bởi các lập trình viên nên lấy từ lớp này.

Lớp System.SystemException là lớp cơ sở cho tất cả các hệ thống ngoại lệ được xác định trước.

Bảng dưới đây cung cấp một số các lớp ngoại lệ được xác định trước xuất phát từ lớp System.SystemException:

Lớp ngoại lệ Mô tả
System.IO.IOException Xử lý lỗi I/O
System.IndexOutOfRangeException Xử lý các lỗi phát sinh khi một phương pháp đề cập đến một chỉ số mảng nằm ngoài phạm vi.
System.ArrayTypeMismatchException Xử lý các lỗi phát sinh khi loại chưa phù hợp với các kiểu mảng.
System.NullReferenceException Xử lý các lỗi phát sinh từ một đối tượng null.
System.DivideByZeroException Xử lý các lỗi phát sinh từ việc chia cho số không.
System.InvalidCastException Xử lý các lỗi phát sinh trong quá trình phân loại.
System.OutOfMemoryException Xử lý các lỗi được tạo ra từ bộ nhớ không đủ.
System.StackOverflowException Xử lý các lỗi phát sinh từ tràn stack.

 

Xử lý ngoại lệ

Sau đây là một ví dụ về cách ném một ngoại lệ khi chia cho số:

using System;
namespace ErrorHandlingApplication
{
   class DivNumbers  //CHIA 2 SO
   {
      int result;  //KET QUA
      DivNumbers()  //KHOI TAO KET QUA BANG KHONG
      {
         result = 0;
      }
      public void division(int num1, int num2)  //HAM CHIA 2 SO
      {
         try
         {
            result = num1 / num2;
         }
         catch (DivideByZeroException e) //NGOAI LE KHI CHIA CHO SO 0
         {
            Console.WriteLine("Bat ngoai le: {0}", e); //IN NGOAI LE GAP PHAI
         }
         finally
         {
            .WriteLine("Ket qua: {0}", result);
         }
      }
      static void Main(string[] args)
      {
         DivNumbers d = new DivNumbers();
         d.division(25, 0);  //CHIA 25 CHO 0 DE TEST
         Console.ReadKey();
      }
   }
}

Khi đoạn mã trên được biên dịch và thực thi, nó tạo ra các kết quả như sau:

Bat ngoai le: System.DivideByZeroException: Attempted to divide by zero. 
at ...
Ket qua: 0

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ệ của riêng bạn. Lớp ngoại lệ do người dùng xác định có nguồn gốc từ lớp Exception. Ví dụ sau đây chứng tỏ điều này:

using System;
namespace UserDefinedException
{
   class TestTemperature
   {
      static void Main(string[] args)
      {
         Temperature temp = new Temperature(); //TAO DOI TUONG NHIET DO
         try
         {
            temp.showTemp();  //IN NHIET DO
         }
         catch(TempIsZeroException e) //NGOAI LE KHI NHIET DO BANG 0
         {
            Console.WriteLine("Ngoai le nhiet do bang 0: {0}", e.Message);
         }
         Console.ReadKey();
      }
   }
}

public class TempIsZeroException: Exception  //TAO LOP NGOAI LE BOI NGUOI DUNG
{
   public TempIsZeroException(string message): base(message)
   {
   }
}

public class Temperature
{
   int temperature = 0; //CHO NHIET DO BANG 0
   public void showTemp()  //IN NHIET DO
   {
      if(temperature == 0)
      {
         throw (new TempIsZeroException("Khong tim thay nhiet do")); //NEM NGOAI LE
      }
      else
      {
         Console.WriteLine("Nhiet do: {0}", temperature);
      }
   }
}

Khi đoạn mã trên được biên dịch và thực thi, nó tạo ra các kết quả như sau:

Ngoai le nhiet do bang 0: Khong tim thay nhiet do

Ném đối tượng

Bạn có thể ném một đối tượng nếu nó trực tiếp hoặc gián tiếp có nguồn gốc từ lớp System.Exception. Bạn có thể sử dụng một lệnh ném trong khối catch để ném các đối tượng hiện tại như:

Catch(Exception e)
{
   ...
   Throw e
}

Chúc bạn thành công !

This site uses Akismet to reduce spam. Learn how your comment data is processed.