Ngoại lệ (exception) là vấn đề - lỗi phát sinh trong quá trình thực thi chương trình. Thường khi chương trình đang chạy mà phát sinh ngoại lệ (lỗi) thì dẫn đến chương trình kết thúc ngay lập tức. Có vô số nguyên nhân để chương trình đang chạy mà phát sinh ngoại lệ, ví dụ: Show
Trong C# khi có một lỗi phát sinh 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 Khi một đối tượng lớp
Thử phát sinh một Exception Chạy đoạn code sau: static void Main(string[] args) { int[] mynumbers = new int[] {1,2,3}; int i = mynumbers[10]; // chỗ này phát sinh lỗi } Đoạn code trên khi chạy sẽ phát sinh lỗi bởi vì, Do lỗi này không được xử lý, nên chương trình kết thúc ngay lập tức và có đọc được thông báo về lỗi như hình trên. Xử lý ngoại lệ - ExceptionNếu ngoại lệ (lỗi thực thi) phát sinh mà không xử lý thì chương trình sẽ dừng đột ngột - nếu muốn xử lý ngoại lệ thì 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. Để bắt ngoại lệ ta sử dụng câu lệnh try { // 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 } catch (Exception loi) { // Khối này thực thi khi có lỗi - đối tượng Exception bắt được lưu ở biến loi } Như vậy đoạn code nào muốn giám sát để bắt ngoại lệ - thì đưa vào khối Đối tượng lớp Exception có một số thuộc tính, tiện dụng cho bạn gỡ rối đó là:
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. Bắt nhiều ngoại lệTrong .NET từ lớp cơ sở Để bắt cụ thể một loại ngoại lệ nào đó chỉ việc thêm một khối try { int x = 10; int y = 0; int z = x / y; } catch (DivideByZeroException e1) { Console.WriteLine(e1.Message); } catch (Exception e2) { Console.WriteLine(e2.Message); } Khi có ngoại lệ chia một số cho 0, thì khối Thêm vào khối finallyTrong lệnh try ... catch, bạn có thể thêm một tùy chọn là khối int x = 10; int y = 0; int z = 0; try { z = x / y; } catch (DivideByZeroException e1) { Console.WriteLine(e1.Message); } finally { // Luôn được thi hành dù có phát sinh ngoại lệ hay không Console.WriteLine(z); } Phát sinh ngoại lệ với throwNếu code của bạn muốn phát sinh ngoại lệ cho biết có một lỗi nào đó vừa xảy ra thì bạn cần tạo ra một đối tượng lớp Ví dụ, xây dựng hàm Thuong nếu tham số thứ 2 bằng không thì phát sinh ngoại lệ. public static double Thuong(double x, double y) { if (y == 0) { // Khởi tạo ngoại lệ, tham số là thông báo lỗi Exception myexception = new Exception("Số chia không được bằng 0"); // phát sinh ngoại lệ, code phía sau throw không được thực thi throw myexception; } return x / y; } static void Main(string[] args) { double z = Thuong(100,0); } Khi chạy, ngoại lệ sẽ phát sinh, và ngoại lệ đó là Giờ muốn bắt chính ngoại lệ do bạn phát sinh static void Main(string[] args) try { double z = Thuong(100,0); } catch (Exception e) { Console.WriteLine(e.Message); } } Chạy, sẽ in ra dòng: "Số chia không được bằng 0" Tạo Exeption riêngNếu muốn tạo ra các lớp để quẳng ra các lỗi khi cần thiết, thì chỉ việc kế thừa lớp Ví dụ, người dùng đưa vào một dữ liệu chuỗi
Tạo thử một lớp đặt tên là using System; namespace CS015_Error_Exception { public class DataTooLongExeption : Exception { const string erroMessage = "Dữ liệu quá dài"; public DataTooLongExeption() : base(erroMessage) { } } } Sử dụng nó để phát sinh ngoại lệ using System; namespace CS15_Error { class Program { public static void UserInput(string s) { if (s.Length > 10) { Exception e = new DataTooLongExeption(); throw e; // lỗi văng ra } //Other code - no exeption } static void Main(string[] args)a { try { UserInput("Đây là một chuỗi rất dài ..."); } catch (DataTooLongExeption e) { Console.WriteLine(e.Message); } catch (Exception otherExeption) { Console.WriteLine(otherExeption.Message); } } } } Khi chạy, ngoại lệ phát sinh và bắt lại được - nó in ra thông báo của ngoại lệ - Mã nguồn hoặc tải về tại ex015 |