Рассмотрим следующую структуру кода С# (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.
}