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