Могу ли я удалить пустой улов с броском? - PullRequest
24 голосов
/ 29 июня 2011

Я надеюсь, что это просто. Я работаю с большой кодовой базой, общее качество хорошее, но иногда вы получаете некоторые из них:

try
{
   // Calls a .NET remoting method.
}
catch
{
   throw;
}

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

Безопасно ли удалить этот пробный улов? Насколько я понимаю, это так, но я подумал, что сначала проверю любое странное поведение.

Ответы [ 4 ]

22 голосов
/ 29 июня 2011

Rethrowing , как вы его показали не должно изменять стек вызовов, если только в удаленных исключениях нет чего-то особенного.(Я знаю, что есть некоторые специальные аспекты, но я не думаю, что они вступают в игру здесь.) Это та вещь, которая действительно теряет информацию:

catch(Exception e)
{
    throw e; // Not throw;
}

Моя догадка заключается в том, что некоторые разработчики включили это просто для того, чтобы они могли поставить точку останова на строке throw.Я бы избавился от этого.

14 голосов
/ 29 июня 2011

Насколько я знаю, catch (Exception ex) { throw ex } сбрасывает трассировку стека.И просто catch { throw; } этого не делает.

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

5 голосов
/ 29 июня 2011

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

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

Несколько статей по теме:

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 / сообщество / блог / Кейт / Архив / 2005/03/31 / 7149.aspx


Кажется устаревшим с .net 2:
Фильтры олицетворения и исключения в версии 2.0

1 голос
/ 14 июня 2018

Хотя в большинстве случаев это, вероятно, избыточный / ненужный код, try { .. } catch { throw; } может подавить оптимизацию компилятора и встраивание метода JIT. Это чаще всего наблюдается в трассировках стека вызовов.

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

Возможно, «ошибка» будет зависеть от этой детали реализации, особенно без явной документации о таком ожидаемом поведении ... и тем более, что это не является гарантией.

См. Релиз НЕ отлажен: 64-битная оптимизация и встраивание метода C # в стеки вызовов Release Build , который предшествовал даже этому старому вопросу.

Хотя код кажется избыточным, код try-catch также не будет устранен во время компиляции .

...