Могу ли я удалить пустой улов с броском?
Я надеюсь, что это просто. Я работаю над большой базой кода, общее качество хорошее, но иногда вы получаете некоторые из них:
try
{
// Calls a .NET remoting method.
}
catch
{
throw;
}
Обратите внимание, что окончательной логики нет, и catch не указывает никаких исключений или делает что-либо, кроме того, что я предоставил выше. Тем не менее, я знаю, что улов и повторное броски могут изменять стек вызовов в деталях исключения. Я не уверен в том, что это поведение происходит именно из-за вызова удаленной .NET.
Безопасно ли удалить эту попытку? Насколько я могу судить, это так, но я думал, что сначала попробую проверить какое-то странное поведение.
Ответы
Ответ 1
Насколько я знаю, catch (Exception ex) { throw ex }
сбрасывает трассировку стека. И просто catch { throw; }
не делает.
Итак, если вы не выполните никакой дополнительной логики при ошибке, например. logging, я не знаю причин, чтобы не удалить этот улов.
Ответ 2
Повторяя, как вы показали, не следует менять стек вызовов, если нет особого особого для удаления исключений. (Я знаю, что есть некоторые особые аспекты, но я не думаю, что они вступают в игру здесь.) Это то, что потеряет информацию:
catch(Exception e)
{
throw e; // Not throw;
}
Я предполагаю, что какой-то разработчик включил это только для того, чтобы поставить точку останова на строку throw
. Я бы избавился от него.
Ответ 3
В определенных ситуациях, связанных с безопасностью доступа к коду, предложение catch-rethrow может быть необходимой функцией безопасности. Но я сомневаюсь, что это применимо здесь. Тем более, что ни один здравомыслящий человек не использовал этот шаблон без добавления комментария.
Точка зрения заключается в том, чтобы предотвратить использование фильтров исключений при увеличении привилегий.
Несколько связанных статей:
http://blogs.msdn.com/b/shawnfa/archive/2005/03/31/404320.aspx
http://msdn.microsoft.com/en-us/library/8cd7yaws(v=VS.100).aspx
http://www.pluralsight-training.net/community/blogs/keith/archive/2005/03/31/7149.aspx
Кажется, устарел, поскольку .net 2:
Фильтры олицетворения и исключения в версии 2.0