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, поэтому вам нужно сначала заменить вложенные блоки, а затем внешние.
Быстрый и грязный трюк:
- поиск и замена try -> if(true) // БЫЛА ПЫТАТЬСЯ
- поиск и замена catch§ -> if(true) // БЫЛ ЛОВИТ §
§ является заполнителем для регулярного выражения, чтобы соответствовать тому, что было перехвачено, и помещать его после комментария WAS CATCH
таким образом вы можете:
- вернуться к поиску БЫЛ ПЫТАТЬСЯ и БЫЛ ПОИСК §
- решите, что нужно заменить, а что нет, когда во время поиска
Я использую для комментариев с помощью // DUMMY каждую временную ловушку во время сеанса отладки.
(поскольку это очень старый пост, я не тратил все время на написание регулярного выражения и т. д., пожалуйста, проявите терпение)