Попробуй наконец или попробуй поймай наконец - PullRequest
5 голосов
/ 21 апреля 2011

Если у меня есть метод, подобный следующему, могу ли я опустить блок catch для достижения тех же результатов ?:

private ClassInstance GetMeANumber()
{
     Resource a = null;

      try
      {
          Resource a = new Resource();
          return a.GetClassInstance();
      }
      catch
      {
          throw;
      }
      finally
      {
          if(a != null)
              a.Dispose();
      }
}

Ответы [ 3 ]

18 голосов
/ 21 апреля 2011

Да, это было бы точно так же.

Тем не менее, более распространенным примером является реализация IDisposable на Resource. Тогда вы можете использовать , используя , чтобы получить ту же вещь более кратко.

using (Resource a = new Resource()) {
    return a.GetClassInstance();
}
2 голосов
/ 10 августа 2011

Блок перехвата "просто перебросить" будет иметь несколько эффектов, которые могут вам понравиться или не понравиться:

  1. Если трассировка стека включает номера строк, номер строки, связанный с подпрограммой, которая перехватываети rethrows будет номером строки rethrow, а не номером строки вызова метода, в котором произошло исключение.В некоторых случаях это может быть очень раздражающим.
  2. Все неявные или явные вложенные блоки "finally" будут проходить свой курс до того, как обработка исключений при первом проходе выполнит сканирование стека, т. Е. До:
    1. Любые блоки внешнего фильтра получат шанс на запуск
    2. отладчик обнаруживает, что исключение будет в конечном итоге необработанным
    3. Внешняя область имеет шанс обнаружить, что исключение будет в конечном итоге необработанным, и уничтожит приложение, не выполняя вложенные блоки «finally».
  3. Если отладчик настроен на перехват необработанных исключений, он будет перехватываться в месте повторного выброса, а не в том месте, где произошло исключение.

В целом, я бы расценил поведение, указанное выше, как нежелательное, но в некоторых случаях можно было бы убедиться, что внутренние блоки "finally" будут выполняться до конца, даже если внешняя ловушка необработанных исключений может захотеть уничтожитьприложение до запуска внешних.

0 голосов
/ 21 апреля 2011

Точнее, отправленный вами кодовый код в значительной степени соответствует тому, на что , использующий блок , можно перевести.Таким образом, ваш код может быть переписан как:

private ClassInstance GetMeANumber()
{
    using (var a = new Resource())
    {
        return a.GetClassInstance();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...