Lập trình Dart - Ngoại lệ

Một ngoại lệ (hoặc sự kiện đặc biệt) là một vấn đề phát sinh trong quá trình thực hiện một chương trình. Khi một Ngoại lệ xảy ra, luồng chương trình bình thường bị gián đoạn và chương trình / Ứng dụng chấm dứt bất thường.

Các ngoại lệ Dart tích hợp bao gồm:

Sr.No Ngoại lệ & Mô tả
1

DeferredLoadException

Bị ném khi không tải được thư viện hoãn lại.

2

FormatException

Ngoại lệ được đưa ra khi một chuỗi hoặc một số dữ liệu khác không có định dạng mong đợi và không thể phân tích cú pháp hoặc xử lý.

3

IntegerDivisionByZeroException

Ném khi một số bị chia cho số không.

4

IOException

Lớp cơ sở cho tất cả các ngoại lệ liên quan đến Inupt-Output.

5

IsolateSpawnException

Ném khi không thể tạo vùng cách ly.

6

Timeout

Bị ném khi thời gian chờ đã lên lịch xảy ra trong khi chờ kết quả không đồng bộ.

Mọi ngoại lệ trong Dart là một kiểu con của lớp được xác định trước Exception. Các trường hợp ngoại lệ phải được xử lý để ngăn ứng dụng ngừng hoạt động đột ngột.

Khối thử / bật / bắt

Các trykhối nhúng mã có thể dẫn đến ngoại lệ. Khối bật được sử dụng khi loại ngoại lệ cần được chỉ định. Cáccatch khối được sử dụng khi trình xử lý cần đối tượng ngoại lệ.

Các try khối phải được theo sau bởi chính xác một on / catch khối hoặc một finallykhối (hoặc một trong cả hai). Khi một ngoại lệ xảy ra trong khối thử, điều khiển được chuyển đếncatch.

Các syntax để xử lý một ngoại lệ như được đưa ra bên dưới -

try { 
   // code that might throw an exception 
}  
on Exception1 { 
   // code for handling exception 
}  
catch Exception2 { 
   // code for handling exception 
}

Sau đây là một số điểm cần nhớ:

  • Một đoạn mã có thể có nhiều khối on / catch để xử lý nhiều trường hợp ngoại lệ.

  • Khối on và khối catch bao gồm lẫn nhau, tức là khối try có thể được liên kết với cả khối on và khối catch.

Đoạn mã sau minh họa việc xử lý ngoại lệ trong Dart:

Ví dụ: Sử dụng Khối BẬT

Chương trình sau chia hai số được đại diện bởi các biến xytương ứng. Mã ném một ngoại lệ vì nó cố gắng chia cho số không. Cácon block chứa mã để xử lý ngoại lệ này.

main() { 
   int x = 12; 
   int y = 0; 
   int res;  
   
   try {
      res = x ~/ y; 
   } 
   on IntegerDivisionByZeroException { 
      print('Cannot divide by zero'); 
   } 
}

Nó sẽ tạo ra những thứ sau output -

Cannot divide by zero

Ví dụ: Sử dụng khối bắt

Trong ví dụ sau, chúng tôi đã sử dụng mã tương tự như trên. Sự khác biệt duy nhất làcatch block(thay vì khối ON) ở đây chứa mã để xử lý ngoại lệ. Tham số củacatch chứa đối tượng ngoại lệ được ném vào thời gian chạy.

main() { 
   int x = 12; 
   int y = 0; 
   int res;  
   
   try {  
      res = x ~/ y; 
   }  
   catch(e) { 
      print(e); 
   } 
}

Nó sẽ tạo ra những thứ sau output -

IntegerDivisionByZeroException

Ví dụ: on… catch

Ví dụ sau đây cho thấy cách sử dụng on...catch khối.

main() { 
   int x = 12; 
   int y = 0; 
   int res;  
   
   try { 
      res = x ~/ y; 
   }  
   on IntegerDivisionByZeroException catch(e) { 
      print(e); 
   } 
}

Nó sẽ tạo ra những thứ sau output -

IntegerDivisionByZeroException

Khối cuối cùng

Các finallykhối bao gồm mã sẽ được thực thi bất kể trường hợp ngoại lệ xảy ra. Tùy chọnfinally khối thực thi vô điều kiện sau khi try/on/catch.

Cú pháp để sử dụng finally khối như sau -

try { 
   // code that might throw an exception 
}  
on Exception1 { 
   // exception handling code 
}  
catch Exception2 { 
   //  exception handling 
}  
finally { 
   // code that should always execute; irrespective of the exception 
}

Ví dụ sau minh họa việc sử dụng finally khối.

main() { 
   int x = 12; 
   int y = 0; 
   int res;  
   
   try { 
      res = x ~/ y; 
   } 
   on IntegerDivisionByZeroException { 
      print('Cannot divide by zero'); 
   } 
   finally { 
      print('Finally block executed'); 
   } 
}

Nó sẽ tạo ra những thứ sau output -

Cannot divide by zero 
Finally block executed

Ném một Ngoại lệ

Các throwtừ khóa được sử dụng để nêu rõ ràng một ngoại lệ. Một ngoại lệ được nêu ra cần được xử lý để ngăn chương trình thoát đột ngột.

Các syntax để nêu ra một ngoại lệ rõ ràng là -

throw new Exception_name()

Thí dụ

Ví dụ sau đây cho thấy cách sử dụng throw từ khóa để đưa ra một ngoại lệ -

main() { 
   try { 
      test_age(-2); 
   } 
   catch(e) { 
      print('Age cannot be negative'); 
   } 
}  
void test_age(int age) { 
   if(age<0) { 
      throw new FormatException(); 
   } 
}

Nó sẽ tạo ra những thứ sau output -

Age cannot be negative

Ngoại lệ tùy chỉnh

Như đã chỉ định ở trên, mọi kiểu ngoại lệ trong Dart là một kiểu con của lớp cài sẵn Exception. Dart cho phép tạo các ngoại lệ tùy chỉnh bằng cách mở rộng các ngoại lệ hiện có. Cú pháp để xác định một ngoại lệ tùy chỉnh như dưới đây:

Cú pháp: Xác định ngoại lệ

class Custom_exception_Name implements Exception { 
   // can contain constructors, variables and methods 
}

Các Ngoại lệ Tùy chỉnh phải được nêu ra một cách rõ ràng và cũng phải xử lý như vậy trong mã.

Thí dụ

Ví dụ sau đây cho thấy cách xác định và xử lý một ngoại lệ tùy chỉnh.

class AmtException implements Exception { 
   String errMsg() => 'Amount should be greater than zero'; 
}  
void main() { 
   try { 
      withdraw_amt(-1); 
   } 
   catch(e) { 
      print(e.errMsg()); 
   }  
   finally { 
      print('Ending requested operation.....'); 
   } 
}  
void withdraw_amt(int amt) { 
   if (amt <= 0) { 
      throw new AmtException(); 
   } 
}

Trong đoạn mã trên, chúng tôi đang xác định một ngoại lệ tùy chỉnh, AmtException. Mã tăng ngoại lệ nếu số tiền được truyền không nằm trong phạm vi ngoại trừ. Cácmain hàm bao gồm lời gọi hàm trong try...catch khối.

Mã sẽ tạo ra những điều sau output -

Amount should be greater than zero 
Ending requested operation....