sử dụng try/catch trong C#

Xử lý ngoại lệ(Exception) giúp ứng dụng, chương trình của bạn tránh được những sự cố, lỗi khi thực thi chương trình. Trong C# cung cấp, hỗ trợ việc sử lý ngoại lệ thông qua các khối lệnh try, catch, finally. Hãy cùng mình tìm hiểu cách sử lý ngoại lệ qua bài viết này nhé.

Ngoại lệ Exception là gì

Ngoại lệ (hay exception) là vấn đề – lỗi phát sinh trong khi chương trình được thực thi. Thông thường khi ứng dụng, chương trình đang chạy mà phát sinh ngoại lệ (lỗi) sẽ dẫn đến chương trình bị kết thúc(dừng lại) ngay lập tức. Có rất nhiều nguyên nhân dẫn tới việc chương trình đang chạy mà phát sinh ngoại lệ, ví dụ như:

  • Dữ liệu do người dùng nhập bị sai, mà chương trình kiểm soát không được.
  • Thực hiện các phép toán không cho phép (ví dụ như chia một số cho 0).
  • Thực hiện thao tác với tài nguyên không tồn tại (ví dụ mở file không có trên đĩa, thực hiện kết nối đến CSDL không tồn tại …).
  • Do thiếu bộ nhớ.

Ở trong C# khi có một lỗi(Exeption ) phát sinh thì hầu hết các lỗi đều có thể quản lý bởi thư viện C# thì nó sẽ phát sinh ra một đối tượng lớp Exeption (System.System) hay là một đối tượng lớp nào đó kế thừa từ Exception.

Exception Handling (Xử lý ngoại lệ) ở trong C# được xây dựng dựa trên 4 từ khóa đó là: trycatchfinally, và throw.

  • try: Một khối try nhận diện một khối code mà ở đó các exception cụ thể được kích hoạt. Các khối code được giám sát để bắt lỗi nếu có. nếu có lỗi sẽ phát sinh ngoại lệ Exception. Ngoại lệ này bắt lại được ở khối catch. Theo sau nó bởi một hoặc nhiều khối catch.
  • catch: Đây là 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 mà bạn muốn xử lý vấn đề đó. Từ khóa catchở trong C# chỉ dẫn việc thực hiện bắt một exception.
  • finally: Một khối finally được sử dụng để có thể thực thi một tập hợp lệnh đã cho. Dù là có hay không một exception được ném hay không được ném. Ví dụ như là nếu bạn mở một file, nó phải được đóng, nếu không sẽ có một exception tạo ra.
  • throw: Là một chương trình ném một exception khi có một vấn đề nào đó xuất hiện. Nó được thực hiện bởi việc sử dụng từ khóa throwtrong C#.
exception trong C#
exception trong C#

Cú pháp

Ví dụ ta có một khối tạo một Exeption và một phương thức bắt một exception bởi sử dụng kết hợp những từ khóa try và catch. Ta đặt một khối try/catch xung quanh code mà có thể xảy ra một exception.

Code ở bên trong của 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# ta viết như sau:

try{

// những lệnh có thể gây ra ngoại lệ (exception)

}catch( tên_ngoại_lệ e1 )

{

// phần code để xử lý lỗi}

catch( tên_ngoại_lệ e2 )

{

// phần code để xử lý lỗi}

catch( tên_ngoại_lệ eN )

{

// phần code để xử lý lỗi}

finally{

// các lệnh được thực thi}

Nếu như ngoại lệ (lỗi thực thi) phát sinh mà chúng ta không xử lý thì chương trình sẽ dừng đột ngột. Nếu muốn xử lý ngoại lệ(lỗi) thì chúng ta cần bắt lấy nó và điều hướng chương trình một cách thích hợp.

Đối tượng lớp Exception trong C# có một số thuộc tính, tiện dụng cho bạn gỡ rối đó là:

  • Message: dạng chuỗi chứa nội dung thông báo lỗi.
  • StackTrace: Là chuỗi chứa các bước thực thi chương trình cho đến khi bị lỗi (có chứa các phương thức, hàm khi thực thi gây lỗi, vị trí file lỗi …)
  • Source: Chứa tên ứng dụng hoặc đối tượng bị lỗi.

Bạn có thể sử dụng nhiều lệnh catch để bắt những loại exception khác nhau tùy vào trong từng trường hợp khối try của bạn xuất hiện nhiều hơn một exception và trong các tình huống khác nhau.

cách xử lý exeption
cách xử lý exeption

Xem thêm:  Csharp là gì?

Thực hành bắt lỗi:

static void Main(string[] args)

{

try {

// khối này được giám sát để bắt lỗi - khi nó phát sinh

int[] mynumbers = new int[] {1,2,3};

int i = mynumbers[10];                  // dòng này phát sinh lỗi

Console.WriteLine(i);                   // dòng này không được thực thi vì lỗi trên

}

catch (Exception loi)

{

// khối này thực thi khi bắt được lỗi

Console.WriteLine("Có lỗi rồi");

Console.WriteLine(loi.Message);

}
}

Có lỗi rồi

Index was outside the bounds of the array.

Lớp Exception trong C# là gì

Các Exception ở trong C# sẽ được biểu diễn bởi các lớp. Các lớp Exception ở trong C# chủ yếu sẽ đượ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 trong C#. Một số lớp Exception khác kế thừa từ lớp System.Exception là các lớp System.ApplicationException và System.SystemException.

Lớp System.ApplicationException nó hỗ trợ các exception được tạo bởi các chương trình ứng dụng. Vì vậy, những exception mà đượ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 đây là lớp cơ sở cho tất cả system exception tiền định nghĩa.

Một số lớp Exception tiền định nghĩa được kế thừa từ lớp Sytem.SystemException trong C#:

Lớp ExceptionMô tả
System.IO.IOExceptionXử lý các I/O lỗi
System.IndexOutOfRangeExceptionXử 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.ArrayTypeMismatchExceptionXử lý các lỗi được tạo khi kiểu là không phù hợp với kiểu mảng
System.NullReferenceExceptionXử lý các lỗi được tạo từ việc tham chiếu một đối tượng null
System.DivideByZeroExceptionXử lý các lỗi được tạo khi chia cho số 0.
System.InvalidCastExceptionXử lý lỗi được tạo trong khi ép kiểu.
System.OutOfMemoryExceptionXử lý lỗi được tạo từ việc thiếu bộ nhớ rỗi.
System.StackOverflowExceptionXử lý lỗi được tạo từ việc tràn ngăn xếp (stack).

Ném (throw) các Object trong C#

Bạn có thể thực hiện ném một đối tượng nếu nó: hoặc là 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
}

Một số điểm cần lưu ý về xử lý Try/Catch trong C#

  • Khối try phải được theo sau bởi một khối catch hoặc finally hoặc là cả 2.
  • Sử dụng các khối try, catch và finally để xử lý các ngoại lệ ở trong C#
  • Có thể sử dụng nhiều khối catch để bắt và xử lý nhiều loại Exception khác nhau.
  • Khối finally sẽ luôn được thực thi bất kể có hay không có ngoại lệ xảy ra.
  • Khối finally phải đặt sau khối try hoặc catch.
  • Trong khối finally sẽ không dùng được các từ khóa return, continue, break vì nó không cho phép dời khỏi khối này.
  • Trong C# khối try catch lồng nhau được sử dụng.
  • Với một ngoại lệ(Exception) nó sẽ được sử lý ở khối catch bên trong nếu tìm thấy bộ lọc thích hợp, còn không nó sẽ bị bắt và xử lý ở khối catch bên ngoài.
  • Việc sử dụng throw thay vì dùng throw ex sẽ giúp giữ stack trace hỗ trợ việc truy vết và lý lý lỗi dễ hơn.

Cảm ơn các bạn đã xem bài viết của mình. Mong nhận được những góp ý từ các bạn để bài viết được hoàn thiện hơn.

Bình luận