Ваш код Dart может генерировать и ловить исключения. Исключением являются ошибки, указывающие на то, что произошло что-то неожиданное. Если исключение не обнаружено, изолятор, вызвавший исключение, приостанавливается, и обычно изолят и его программа завершаются.
В отличие от Java, все исключения Dart являются непроверенными исключениями. Методы не объявляют, какие исключения они могут генерировать, и вы не обязаны перехватывать какие-либо исключения.
Dart предоставляет типы Exception и Error, а также множество предопределенных подтипов. Вы можете, конечно, определить свои собственные исключения. Тем не менее, программы Dart могут выбрасывать любой ненулевой объект — не только объекты Exception и Error — в качестве исключения.
Throw
Вот пример выброса или повышения риска исключения:
throw FormatException('Expected at least 1 section');
Вы также можете бросать произвольные объекты:
throw 'Out of llamas!';
Поскольку генерирование исключения является выражением, вы можете генерировать исключения в операторах =>, а также в любом другом месте, где разрешены выражения:
void distanceTo(Point other) => throw UnimplementedError();
Catch
Поймать или захватить исключение останавливает распространение исключения (если вы не сбросите исключение). Поймать исключение дает вам возможность обработать это:
try {
breedMoreLlamas();
} on OutOfLlamasException {
buyMoreLlamas();
}
Для обработки кода, который может генерировать более одного типа исключений, вы можете указать несколько предложений catch
. Первое предложение catch
, соответствующее типу брошенного объекта, обрабатывает исключение. Если в предложении catch
не указан тип, это предложение может обрабатывать любой тип брошенного объекта:
try {
breedMoreLlamas();
} on OutOfLlamasException {
// A specific exception
buyMoreLlamas();
} on Exception catch (e) {
// Anything else that is an exception
print('Unknown exception: $e');
} catch (e) {
// No specified type, handles all
print('Something really unknown: $e');
}
Как показывает предыдущий код, вы можете использовать on
или catch
или оба. Используйте, когда вам нужно указать тип исключения. Используйте catch
, когда вашему обработчику исключений нужен объект исключения.
Вы можете указать один или два параметра для catch()
. Первое — это исключение, а второе — трассировка стека (объект StackTrace).
try {
// ···
} on Exception catch (e) {
print('Exception details:\n $e');
} catch (e, s) {
print('Exception details:\n $e');
print('Stack trace:\n $s');
}
Чтобы частично обработать исключение и разрешить его распространение, используйте ключевое слово rethrow
void misbehave() {
try {
dynamic foo = true;
print(foo++); // Runtime error
} catch (e) {
print('misbehave() partially handled ${e.runtimeType}.');
rethrow; // Allow callers to see the exception.
}
}
void main() {
try {
misbehave();
} catch (e) {
print('main() finished handling ${e.runtimeType}.');
}
}
Finally
Чтобы убедиться, что какой-то код выполняется независимо от того, было ли выброшено исключение, используйте предложение finally
. Если ни одно предложение catch
не соответствует исключению, исключение распространяется после выполнения предложения finally
:
try {
breedMoreLlamas();
} finally {
// Always clean up, even if an exception is thrown.
cleanLlamaStalls();
}
Предложение finally
запускается после любых соответствующих предложений catch
:
try {
breedMoreLlamas();
} catch (e) {
print('Error: $e'); // Handle the exception first.
} finally {
cleanLlamaStalls(); // Then clean up.
}
Узнайте больше, прочитав раздел «Исключения» в туре по библиотеке.