MSVS C# самый быстрый способ удалить блоки try-catch?

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

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

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

4 ответа

Решение

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

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

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

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

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

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

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

Найдут ваши плохие уловы:

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

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

улов \ п {\nthrow;\ п}

Я нашел решение для этого для 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, поэтому вам нужно сначала заменить вложенные блоки, а затем внешние.

Быстрый и грязный трюк:

  1. поиск и замена try -> if(true) // БЫЛА ПЫТАТЬСЯ
  2. поиск и замена catch§ -> if(true) // БЫЛ ЛОВИТ §

§ является заполнителем для регулярного выражения, чтобы соответствовать тому, что было перехвачено, и помещать его после комментария WAS CATCH

таким образом вы можете:

  • вернуться к поиску БЫЛ ПЫТАТЬСЯ и БЫЛ ПОИСК §
  • решите, что нужно заменить, а что нет, когда во время поиска

Я использую для комментариев с помощью // DUMMY каждую временную ловушку во время сеанса отладки.

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

Другие вопросы по тегам