Рассмотрим следующую структуру кода C # (S0-S3 являются заполнителями для произвольных блоков кода):
try
{
S0;
}
catch (Exception ex)
{
S1;
}
finally
{
S2;
}
S3;
В случае, если S1 генерирует исключение внутри обработчика catch
, S2 внутри finally
все равно будет выполняться (но S3 не будет).
Вопрос
Предполагая, что S1 не может выбросить , есть ли смысл иметь S2 внутри блока finally
, вместо того, чтобы иметь его вне try / catch / finally, непосредственно перед S3?
Пример
try
{
// Do something that might throw
}
catch (Exception ex)
{
// Save the exception to re-throw later
// NB: This statement cannot throw an exception!
this.cachedException = ex;
}
finally
{
S2;
}
S3;
Есть ли смысл иметь блок finally
? Не будет ли следующий код не эквивалентным (при строгом предположении, что то, что находится внутри блока catch
, не может выдать):
try
{
// Do something that might throw
}
catch (Exception ex)
{
// Save the exception to re-throw later
// NB: This statement cannot throw an exception!
this.cachedException = ex;
}
// No finally block needed (?)
S2;
S3;
Вторичный вопрос
Обновление: Если будет принято, что два кодовых блока выше эквивалентны (согласно заявленным предположениям), то, учитывая обратную связь по ясности кода в ответах, будет ли это предпочтительным (и эквивалентным ) объединить S2 и S3 внутри блока finally
?
try
{
// Do something that might throw
}
catch (Exception ex)
{
// Save the exception to re-throw later
// NB: This statement cannot throw an exception!
this.cachedException = ex;
}
finally
{
S2; // Put S2 and S3 together inside the `finally` block to guard against
S3; // future changes in the `catch` filter, or handling code.
}