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 x và ytươ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....