Generic trong Dart (Bài trước)
(Bài tiếp) Asynchronous

Exception trong Dart

Dart giống như các ngôn ngữ khác, nó có thể phát sinh các ngoại lệ Exception(thông báo phát sinh lỗi), nếu ngoại lệ đó không được bạn bắt lại thi chương trình sẽ kết thúc với lỗi.

Dart cung cấp sẵn lớp Exception và lớp Error để bạn sử dụng, hoặc xây dựng các ngoại lệ. Tạo một ngoại lệ bằng câu lệnh new Exception('Thông báo lỗi');

Dart cũng triển khai từ Exception, Error ra nhiều ngoại lệ để sử dụng cho từng loại lỗi không hợp lệ khác nhau như:

Ngoại lệ Sử dụng
TimeoutException Lỗi khi đặt đến giới hạn thời gian chờ async
FormatException Lỗi khi dữ liệu không đúng định dạng
IOException Lỗi IO (vào/ra), từ nó triển khai các ngoại lệ FileSystemException HttpException ProcessException SignalException SocketException StdinException StdoutException TlsException WebSocketException

Như vậy tạo một đối tượng Exception dùng cú pháp

var e = new Exception('Thông báo lỗi');

Throw - Phát sinh lỗi

Để phát sinh lỗi bạn dùng từ khóa throw theo sau là Exception muốn phát đi

Ví dụ khi gọi hàm sau mà truyền tham số là 'A' hoặc 'B' thì sẽ phát sinh lỗi

myfunction(String s) {
    if (s == 'A')
      throw new Exception('Dữ liệu sai');
    if (s == 'B')
      throw new FormatException('Sai dịnh dạng');
}

myfunction('A');

//KẾT QUẢ CHẠY
Unhandled exception:
Exception: Dữ liệu sai
#0 myfunction (file:///D:/dart-learning/main.dart:3:7)
#1 main (file:///D:/dart-learning/main.dart:7:4)
#2 _startIsolate.<anonymous closure> (dart:isolate/runtime/libisolate_patch.dart:289:19)
#3 _RawReceivePortImpl._handleMessage (dart:isolate/runtime/libisolate_patch.dart:171:12)
Exited (255)

Bắt ngoại lệ với try - catch

Như đã biết, nếu ngoại lệ phát sinh mà không bắt lại thì sẽ dừng chương trình, nếu muốn bắt ngoại lệ dùng lệnh try với cú pháp như sau

try {
   //Các code trong try nếu
   //phát sinh ngoại lệ sẽ được bắt lại
   myfunction('A');
}
on FormatException catch(e) {
    //Khối này bắt nếu lỗi là FormatException
    print('Lỗi xảy ra' + e.message);
}
catch (e) {
    //Khối này bắt lỗi bất kỳ
    print('Lỗi xảy ra' + e.message);
}
finally  {
    //Khối này chạy nếu có catch xảy ra
}

Khối finally chạy sau khi bắt lỗi - nếu không cần thì bỏ đi

on ... catch để bắt một loại lỗi có kiểu cụ thể nào đó, bạn có thể khai báo nhiều kiểu để ứng vào kiểu lỗi nào thì chạy khối lệnh tương ứng ở điểm catch đó.

Như vậy, khi lỗi được bắt lại, chương trình vẫn chạy tiếp theo yêu cầu xử lý của code chứ không dừng đột ngột


Đăng ký nhận bài viết mới
Generic trong Dart (Bài trước)
(Bài tiếp) Asynchronous