«Перед выполнением блока« catch »среда выполнения проверяет наличие блоков« finally »». Что это значит? - PullRequest
0 голосов
/ 26 февраля 2019

Из официального документа об обработке исключений :

Перед выполнением блока catch среда выполнения проверяет блоки finally.

Мне кажется, что автор хочет сказать: " блоки finally выполняются до catch block ".

Но этот код делает противоположное:

try
{
    throw new Exception();
}
catch (Exception e)
{
    Console.WriteLine("In the catch block.");
}
finally
{
    Console.WriteLine("In the finally block.");
}
// Output:
// In the catch block.
// In the finally block.

Что на самом деле означает это утверждение?

Ответы [ 2 ]

0 голосов
/ 26 февраля 2019

Это очень двусмысленно сформулировано.Они пытались указать, что любые finally блоки любых вложенных try блоков 1 (у которых не было соответствующего блока catch для исключения) будутбудет выполнен, затем блок catch, который соответствует exception (и затем его собственному finally, очевидно, если только он не вызывает другое исключение, которое не обработано, и среда выполнения сорвана, что может произойти).

Это печатает A, B, C:

try {
  try {
    throw new Exception();
  }
  catch (ArgumentOutOfRangeException ex)
  {
    Console.WriteLine("No!");
  }
  finally
  {
    Console.WriteLine("A");
  }
}
catch (Exception ex2)
{
  Console.WriteLine("B");
}
finally
{
  Console.WriteLine("C");
}

Подсказка, о которой он не говорит, это его собственная finally в том, что он относится к finally блоку s - множественное число.Поскольку каждый try может иметь только один finally, он должен ссылаться на другие блоки finally.


1 В пределах самого блока try или внутридругой код, вызываемый try.

0 голосов
/ 26 февраля 2019

Это «ошибка» в документации.Проблема была подана здесь .

Соответствующий блок catch (если есть) выполняется перед потенциальным finally блоком того же try-catch-наконец построить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...