Trang chủ » Blog » Bí kíp bắt ngoại lệ Exception trong C# cơ bản

Bí kíp bắt ngoại lệ Exception trong C# cơ bản

bởi CodeGym | 14:11 | Blog

Exception là lỗi không mong đợi xảy ra trong quá trình thực thi của chương trình. Trong C# cơ bản, xử lý lỗi ngoại lệ được thực hiện bằng câu lệnh try / catch. Khối try trong C # được sử dụng để đặt đoạn code có thể dẫn tới ngoại lệ. Khối catch được sử dụng để xử lý lỗi ngoại lệ. Khối catch phải được bắt đầu bằng khối try. Khối finally cho phép lập trình viên dọn dẹp mọi trạng thái không rõ ràng có thể còn sót lại từ khối try bị hủy bỏ hoặc giải phóng tài nguyên đang sử dụng.

try
{
    // Đoạn code cần test.
}
catch (SomeSpecificException ex)
{
    // Code xử lý exception.
}
finally
{
    // Code chạy sau khi các bước try, catch chạy xong.
}

Viết phần mềm là một nhiệm vụ phức tạp, nên rất nhiều ngoại lệ (Exception) có thể xảy ra trong quá trình phát triển dẫn đến hiện tượng crash. Một số lỗi phổ biến có thể kể đến như: dữ liệu đầu vào không hợp lệ, tài nguyên không khả dụng,… Một ứng dụng được thiết kế tốt phải xử lý các trường hợp Exception và ngăn ứng dụng gặp sự cố. Bài viết này mô tả 5 nguyên tắc cơ bản cần tuân theo khi xử lý các ngoại lệ trong C# để giúp sử dụng Exception một cách hiệu quả.

Dùng throw, không dùng throw ex

Việc sử dụng throw ex bên trong khối catch sẽ không giữ được lịch sử quá trình hình thành lỗi (stack trace) dẫn đến thông báo về đoạn code lỗi đầu tiên sẽ bị mất. Việc này dẫn đến throw ex sẽ báo lỗi tại dòng throw ex được gọi thay vì đoạn code lỗi trong try. Thay vào đó, hãy sử dụng lệnh throw để dễ dàng xác định chính xác đoạn code gây lỗi.

// Bad code
catch(Exception ex)
{
throw ex;
}

// Good code
catch(Exception ex)
{
throw;
}

Không dùng khối lệnh catch rỗng để nuốt Exception

Cách sử dụng Exception tệ nhất là catch Exception nhưng không làm gì để khôi phục chương trình. Việc này tệ hơn việc không bắt Exception. Developer và user sẽ không nhận thức được vấn đề ngay tại thời điểm xảy ra dẫn đến các lỗi âm thầm ngấm vào hệ thống. Thời điểm từ lúc xảy ra lỗi đến lúc phát hiện càng dài thì càng gây nhiều thiệt hại và công sức để khắc phục.

// Bad code
try
{
// Code that will throw exception
}
catch (Exception ex)
{
// Xin đừng bao giờ để trống như thế này!!!
}

Ví dụ khi đọc dữ liệu của người dùng từ database, Exception không thể đọc dữ liệu của một người dùng xảy ra do sai định dạng dữ liệu tại cột ngày sinh. Nếu Exception chỉ được catch mà không xử lý, developer chỉ phát hiện lỗi khi chương trình bắt đầu truy xuất ngày sinh của user lỗi. Tệ hơn là developer phát hiện lỗi thông qua việc hiển thị sai ngày sinh (giá trị mặc định), dẫn đến mất rất nhiều công sức để truy ngược nguồn gốc lỗi từ UI đến phần logic định dạng dữ liệu.

Không nên dùng Exception với lỗi thường xảy ra và có thể dự báo trước

Dùng Exception khi một lỗi xảy ra mà developer không có cách nào kiểm tra để ngăn ngừa và không thể khôi phục để chương trình chạy tiếp, ví dụ nên sử dụng Exception khi không thể kết nối đến database do không có internet, developer không thể biết trước khi nào không có internet, không có cách nào để kết nối internet hộ người dùng. Một số ví dụ về tình huống không nên sử dụng Exception:

  • Kiểm tra kết nối đến database chưa được đóng trước khi đóng kết nối.
  • Kiểm tra file tồn tại trước khi mở file.
  • Kiểm tra bảng chưa tồn tại trước khi tạo bảng trong database.
  • Kiểm tra mẫu số khác 0 trước khi chia.
  • Kiểm tra null trước khi sử dụng object.
  • Sử dụng Try khi parse dữ liệu.
// Bad code
int.Parse(input);

// Good code
int.TryParse(input, out int output);

Viết thông báo exception với ý nghĩa rõ ràng, chính xác

Đảm bảo rằng các thông báo lỗi rõ ràng và kết thúc bằng dấu chấm. Thông báo Exception không được mơ hồ, có thể hiểu theo nhiều cách. Thông báo rõ ràng và có ý nghĩa giúp nhà phát triển hiểu rõ vấn đề có thể xảy ra trong khi cố gắng tái tạo và khắc phục vấn đề. Chắc chắn việc nhận được báo lỗi “Could not find the requested file” sẽ giúp bạn nhanh chóng xác định, xử lý vấn đề hơn “Something went wrong”.

// Bad code
catch (FileNotFoundException ex)
{
this.logger.LogError(ex, "Something went wrong");
}
// Good code
catch (FileNotFoundException ex)
{
this.logger.LogError(ex, "Could not find the requested file.");
}

Tận dụng các Exception có sẵn của C#

Trong thư viện của C# đã có rất nhiều Exception được định nghĩa sẵn:

  • FileNotFoundException khi file không tồn tại.
  • IndexOutOfRangeException khi truy xuất một phần tử nằm ngoài mảng.
  • DivideByZeroException khi chia cho 0.
  • InvalidOperationException khi một hàm được gọi phù hợp ở trạng thái hiện tại của đối tượng.
  • ArgumentException, ArgumentNullException, hoặc ArgumentOutOfRangeException khi tham số không hợp lệ.

Các Exception có sẵn đủ dùng trong hầu hết các trường hợp. Sử dụng chung Exception có sẵn giúp các developer khác dễ dàng hiểu code khi đọc và tăng tính tương thích với các hệ thống code khác. Do đó, chỉ tạo một class Exception mới khi cần xử lý ngoại lệ liên quan đến bài toán kinh doanh cụ thể, ví dụ: Một ngoại lệ tùy chỉnh – ItemUnavailableException có thể được sử dụng trong thương mại điện tử để theo dõi các lỗi liên quan đến hết hàng cần bán.

Tổng kết

Đây là 5 bí kíp bắt ngoại lệ Exception trong C# cơ bản mà tôi sử dụng và thấy rất hữu ích trong công việc hàng ngày của mình. Một số điều trên có thể trông hiển nhiên nhưng thường không được nhiều người chú ý. Hãy cho tôi biết suy nghĩ của bạn và chia sẻ các phương pháp xử lý ngoại lệ mà bạn tuân theo.

Ngoài ra, bạn có thể tải ngay bộ giáo trình C# cơ bản đến nâng cao tại đây.

Download - Giáo trình thuật toán

6 + 6 =

Tags:

0 Lời bình

Gửi Lời bình

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *

BÀI VIẾT LIÊN QUAN

BẠN MUỐN HỌC LẬP TRÌNH?

GỌI NGAY

098 953 44 58

Đăng ký tư vấn lộ trình học lập trình

Đăng ký tư vấn, định hướng lộ trình học và giải đáp các thắc mắc về ngành nghề – Miễn phí – Online.

3 + 2 =

TƯ VẤN VỀ LỘ TRÌNH HỌC NGHỀ LẬP TRÌNH TẠI CODEGYM
TƯ VẤN VỀ LỘ TRÌNH HỌC NGHỀ LẬP TRÌNH TẠI CODEGYM