MSVS C # самый быстрый способ удалить блоки try-catch? - PullRequest
7 голосов
/ 21 марта 2011

Я взял на себя незавершенный проект и, к моему полному недоверию, каждая отдельная функция обернута операторами try-catch в том же формате:

try
{
   // work work.
}
catch(Exception ex)
{
   MessageBox.Show(ex.Message, ...);
}

Когда я ищу SO для способа быстрого удаления всехэти блоки try-catch, я обнаружил, что люди на самом деле ищут способ автоматически обернуть свои функции try-catch!хммм ... Это хорошая практика программирования вообще?Есть ли способ удалить все блоки вместо этого, чтобы он облегчил отладку и позволил мне действительно устранить исключения?

Ответы [ 4 ]

9 голосов
/ 21 марта 2011

Вы можете изменить эту опцию здесь:

Debug -> Exceptions -> CLR Exceptions -> Check the "Thrown" checkbox.

Это приводит к сбою компилятора при возникновении исключения перед проверкой любых catch блоков.

2 голосов
/ 21 марта 2011

Поиск в Regex в Visual Studio довольно мощный, но его немного сложно использовать, вот что вам может пригодиться при поиске приведенного выше кода: (Обратите внимание, в диалоговом окне поиска, в разделе «Параметры» выберите «Использовать»: Регулярные выражения ")

Найдет ваши неудачные уловы:

catch. * \ N +: b + {[.: b \ n] MessageBox. [.: b \ n] *}

Если вы хотите сделать прямую замену броском:

catch \ n {\ nthrow; \ n}

2 голосов
/ 21 марта 2011

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

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

Я бы нашел и заменил на MessageBox.Show(ex на throw //MessageBox.Show(ex и заменил бы их все. Вам придется вручную найти те, которые действительно должны быть там, и вернуть их обратно.

0 голосов
/ 28 января 2016

Я нашел решение этой проблемы для VB.NET.

Замените это:

\s(?<!End )Try((.|\r\n)+?)Catch(.|\r\n)+?(Finally((.|\r\n)+?)End Try|End Try)

... этим:

$1$5

Он удалит весь блок try / catch, оставив после себя только то, что было в блоки try и finally.Тем не менее, он не работает с вложенными try / catch, поэтому вам нужно сначала заменить вложенные блоки, а затем внешние.

...