Оператор rethrow
Оператор rethrow используется внутри блока catch
для повторного выбрасывания пойманного исключения. В отличие
от оператора throw, который создает новое исключение,
rethrow сохраняет исходный объект исключения и его
трассировку стека. Это позволяет обработать ошибку частично
(например, залогировать ее) и передать дальше наверх по стеку
вызовов без потери информации о месте возникновения.
Оператор rethrow не принимает параметров и может
использоваться только внутри блока catch. Если
попытаться вызвать его вне этого блока, компилятор выдаст
ошибку.
Синтаксис
try
{
// code that may throw
}
catch (e)
{
// some handling
rethrow;
}
Пример
Давайте поймаем исключение, залогируем его и повторно
выбросим с помощью rethrow:
void main()
{
try
{
try
{
throw FormatException('bad format');
}
catch (e)
{
print('Caught: $e');
rethrow;
}
}
catch (e)
{
print('Outer caught: $e');
}
}
Результат выполнения кода:
"Caught: FormatException: bad format"
"Outer caught: FormatException: bad format"
Пример
Давайте сравним поведение rethrow и throw.
При использовании throw исходная трассировка стека
теряется, а при rethrow - сохраняется:
void main()
{
try
{
validate(-1);
}
catch (e, stackTrace)
{
print('Error: $e');
print('Stack trace contains validate: ${stackTrace.toString().contains('validate')}');
}
}
void validate(int value)
{
try
{
if (value < 0)
{
throw ArgumentError('value must be positive');
}
}
catch (e)
{
rethrow;
}
}
Результат выполнения кода:
"Error: Invalid argument(s): value must be positive"
"Stack trace contains validate: true"
Смотрите также
-
оператор
throw,
который выбрасывает новое исключение -
конструкция
catch,
которая ловит исключения -
конструкция
try,
которая задает блок кода для отслеживания -
класс
StackTrace,
который хранит трассировку стека