Есть исключения в c # om nom nom - PullRequest
10 голосов
/ 07 октября 2010

Учитывая, что употребление исключений - это всегда плохо, а повторное создание исключения приводит к потере стека вызовов, как правильно переформулировать следующее?

Исключения в еде:

try
{
  … do something meaningful
}
catch(SomeException ex)
{
   // eat exception
}

Ответы [ 16 ]

0 голосов
/ 07 октября 2010

едят исключения не всегда "плохое дзюю".Здесь нет магии;просто напишите код, чтобы сделать то, что вам нужно сделать.С точки зрения гигиены, если вы поймали исключение и проигнорировали его, прокомментируйте, почему вы это делаете.

try
{
 .....
}
catch (something)
{
  // we can safely ignore ex becuase ....
}
0 голосов
/ 07 октября 2010

Конкретный способ употребления исключений не важен. Никогда не ешьте исключения любым способом!

Отлавливайте только те исключения, которые ожидаются и с которыми вы можете что-то сделать. Примерами этого являются файловый и сетевой ввод-вывод, исключения безопасности и т. Д. В этих случаях вы можете отобразить объяснение того, что произошло с пользователем, а иногда вы можете изящно восстановиться.

Не перехватывать исключения, которые никогда не должны возникать. Примерами этого являются исключения с нулевой ссылкой, недопустимые исключения операций и т. Д. Код должен быть написан так, чтобы эти исключения никогда не возникали, поэтому нет необходимости перехватывать их. Если эти исключения случаются, то исправит ошибки . Не глотайте исключения.

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

0 голосов
/ 07 октября 2010

Вы можете перебросить исключение, не теряя стек вызовов, просто перебросьте как

catch(Exception e)
{
  throw;
}

Зачем вам это нужно? Пример использования: Где-то в вашем приложенииу вас есть сторонний код, и вы оборачиваете его, и если он генерирует исключения, вы генерируете WrappingException.

Когда вы выполняете какой-то другой код, вы можете получить исключение либо от 3-го участника, либо от вашего собственного, поэтому вам может потребоваться:

try
{
//code that runs 3rd party
//your code, but it may throw Null ref or any other exception
}
catch( WrappingException)
{
 throw;
}
catch( Exception e)
{
 throw new MyAppLayer3Exception("there was exception...", e);
}

В этом случае вы не заключаете WrappingException в свое MyAppLayer3Exception.

Таким образом, на верхнем уровне вашего приложения вы можете перехватывать все исключения и, зная тип исключения, вы будете знать, откудаэто пришло!

Надеюсь, это поможет.

0 голосов
/ 07 октября 2010

Если блок catch на самом деле не делает что-то с исключением (например, записывает его в файл системных ошибок), нет необходимости даже иметь блок try / catch.

При этом, если исключение стоит сообщить пользователю (например, зарегистрировать его), то для этого непременно используйте блок catch.

Одна особенно плохая ловушка игнорирования исключений состоит в том, что определенные (фатальные) исключения должны вызывать завершение программы. Такие исключения (например, неудача при загрузке класса) оставляют программу в нестабильном состоянии, что приведет к катастрофе только позднее при выполнении. В этих случаях регистрация исключения, а затем корректное завершение - единственно разумная вещь.

0 голосов
/ 07 октября 2010

Часть проблемы с едой исключений заключается в том, что по сути неясно , что они скрывают.Так что ... вопрос о правильном рефакторинге не так легко ответить.В идеале, однако, вы бы полностью удалили предложение try ... catch;в большинстве случаев это не нужно.

Лучше всего избегать try...catch полностью, где это возможно;если вам приходится иметь дело с исключениями, то делайте это как можно локально и конкретно, и не распространяйте их вверх по стеку;наконец, включите глобальный обработчик необработанных исключений, который ведет соответствующую запись в журнал (и, возможно, предлагает перезапустить приложение при необходимости).

0 голосов
/ 07 октября 2010

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

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