В стандартной библиотеке языка Dart есть два класса, которые являются основными для всех остальных типов ошибок и исключений. Во-первых, это класс Exception, который является базовым классом для всех остальных типов исключений. И во-вторых, это класс Error, который является базовым классом для для всех типов ошибок.
Итак, у нас есть два типа ситуаций - исключения и ошибки. В чем разница между ними? Исключения обычно представляют такие ситуации, которые нельзя обнаружить или спрогрогнозировать или проверить на уровне кода. Ошибки, наоборот, представляют ситуации, которые могут быть обнаружены на уровне программного кода.
В конструкции try..catch мы можем обрабатывать исключения и ошибки определенного типа. Для этого применяется оператор on:
void main (){ try{ int x = 9; int y = 0; int z = x ~/ y; print(z); } on Error{ print("Обработка ошибки в блоке on"); } print("Завершение программы"); }
После оператора on указывается тип исключения или ошибки, которые надо обработать. В данном случае выражение on Error
говорит,
что мы обрабатываем исключения типа Error. А поскольку это базовый тип для всех ошибок, то фактически мы обрабатываем все ошибки.
Подобным образом можно обрабатывать и исключения:
void main (){ try{ int x = 9; int y = 0; int z = x ~/ y; print(z); } on Exception{ print("Обработка исключения в блоке on"); } print("Завершение программы"); }
Но мы также можем конкретизировать тип ошибки или исключения:
void main (){ try{ int x = 9; int y = 0; int z = x ~/ y; print(z); } on IntegerDivisionByZeroException{ print("Обработка исключения IntegerDivisionByZeroException"); } print("Завершение программы"); }
В данном случае мы обрабатываем исключения только типа IntegerDivisionByZeroException. Если в блоке try вдруг возникнут исключения других типов, то они будут не обработаны.
Обработку конкретных типов исключений можно делать вместе с блоком catch:
void main (){ try{ int x = 9; int y = 0; int z = x ~/ y; print(z); } on IntegerDivisionByZeroException{ print("Обработка исключения IntegerDivizionByZeroException"); } catch(e){ print("Возникло исключение: $e"); } print("Завершение программы"); }
В данном случае если возникнет исключение типа IntegerDivisionByZeroException, то его будет обрабатывать блок on, если исключение другого типа - то блок catch.
Стоит отметить, что IntegerDivisionByZeroException является одновременно и исключением и ошибкой, поскольку реализует интерфейс типом Exception и UnsupportedError (тип ошибки, производный от Error)
Также мы можем объединить блоки on и catch:
void main (){ try{ int x = 9; int y = 0; int z = x ~/ y; print(z); } on IntegerDivisionByZeroException catch(e, s){ print("Обработка исключения $e"); print("Стек $s"); } print("Завершение программы"); }
На данный момент в языке Dart есть много типов исключений:
DeferredLoadException
FormatException
IntegerDivisionByZeroException (помечен как устаревший)
IOException
FileSystemException
PathNotFoundException
HttpException
RedirectException
ProcessException
SignalException
SocketException
StdinException
StdoutException
TlsException
CertificateException
HandshakeException
WebSocketException
IsolateSpawnException
TimeoutException
NullRejectionException
OSError
Также есть много типов ошибок для различных ситуаций:
ArgumentError
IndexError
RangeError
AssertionError
AsyncError
ConcurrentModificationError
JsonUnsupportedObjectError
JsonCyclicError
NoSuchMethodError
OutOfMemoryError
RemoteError
StackOverflowError
StateError
TypeError
UnimplementedError
UnsupportedError
Для каждого типа исключения или ошибки, который мы хотим обработать, мы можем добавить свой блок on:
void main (){ try{ int x = 9; int y = 0; int z = x ~/ y; print(z); } on IntegerDivisionByZeroException{ print("Обработка исключения IntegerDivisionByZeroException"); } on FormatException{ print("Обработка исключения FormatException"); } print("Завершение программы"); }