Зачем мне писать throw, если исключение всплыло в любом случае? - PullRequest
4 голосов
/ 13 августа 2011

Почему я должен написать ключевое слово throw в блоке catch, чтобы всплыть исключение, когда исключение все равно возрастет?

Ответы [ 4 ]

6 голосов
/ 13 августа 2011

Прежде всего, вы бы сделали это, если бы вы хотели сделать какую-то особую логику или логику обработки ошибок. Много раз можно просто использовать try{} finally{}, если вам нужно исключение, чтобы всплыть, и, наконец, избавиться от любых используемых ресурсов.

Его также можно использовать для ветвления на основе отладки или нет (так что ваши пользователи не видят следы уродливого стека):

   catch(Exception e) 
   { 
#if DEBUG
      throw;
#else
      Log(e);
#endif
   }
3 голосов
/ 13 августа 2011

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

Например, если вы пытались проанализировать номер сотрудника, полученный с сервера LDAP, или что-то еще:

try
{
    Convert.ToInt32(employeeNumber);
}
catch(FormatException fe)
{
    throw new ArgumentException("Employee Number" +employeeNumber +" is not valid. ", fe);
}
1 голос
/ 13 августа 2011

Если вы не используете ключевое слово throw внутри блока catch, исключение будет не всплывающим.Если все, что вы делаете в блоке catch, это throw (не throw new), тогда вам не нужен блок catch, а если нет блока finally, вы можете отказаться от tryполностью.

1 голос
/ 13 августа 2011

Ты не прав.

Например:

try
{
    // Something throws an exception
}
catch
{
}

Это отключит любое исключение, так что "исключение не будет всплывать".

Возможно, вы имеете в виду, если обязательно попробовать / перехватить, чтобы всплыло исключений для вызывающей стороны какого-либо метода или свойства. Это не .

Для IDisposable реализаций вы можете использовать с помощью оператора , поэтому объект (ы) высвобождает базовые ресурсы:

using(disposableObject) 
{
}

А для других, не реализующих IDisposable , вы можете использовать try / finally :

try
{
     // Code
}
finally
{
     // Do something in any case: even if an exception has been thrown.
}

В любом случае, обратите внимание на тот факт, что повторное генерирование исключения в блоке перехвата , как правило, теряет содержимое трассировки стека , поэтому, если вам нужны сообщения об ошибках с трассировкой исключения, вам необходимо принять попробуйте / наконец подойдите - или с использованием , если в партии есть IDisposable объекты - (подробнее читайте по этой ссылке: http://blogs.msdn.com/b/jmstall/archive/2007/02/07/catch-rethrow.aspx)

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