Подтвердить что ты не робот

С#: найти все пустые блоки catch

Я рассматриваю некоторый код.

Я заметил несколько пустых блоков улова. Не очень хорошая идея, потому что что-то не работает, и вы не можете понять, почему.

Есть ли простой способ найти все пустые блоки try catch в решении?

4b9b3361

Ответ 1

Используйте глобальное диалоговое окно поиска, включите регулярные выражения и затем выполните поиск:

catch:b*\([^)]*\):b*\{:b*\}

Ответ 2

FxCop найдет их вместе со многими другими потенциальными проблемами.

Ответ 3

Расширен принятый ответ для удовлетворения всех условий, описанных ниже. Обновлен для Visual Studio 2017/2019, работает как для С#, так и для C++.

Используйте диалог поиска (CTRL + SHIFT + F), включите регулярные выражения и выполните поиск:

^(?!\/\/|\/\*).*catch\s*(?:\([^)]*\))*\s*\{\s*(?:(?:\/\/|\/\*).*(\*\/)?\s*)*\}

Матчи:

catch {}
catch{}
catch{
}
catch 
{}
catch () {}
catch (...) {}
catch (int x) {}
catch (Exception x) {}
catch (Exception ex){
}
catch(...){
}
} catch (...){
/**/
}
} catch (...){
/**/
///
}
} catch (...){
//
//
/**/
}
catch (...)
{}
catch(...) { //single line
}
catch(...) { 
//single line}
catch(...) { 
//single line
}
catch(...) { /*multiline*/
}
catch(...) {
 /*multiline*/}
catch(...) {
 /*multiline*/
}
catch (...){ // int i = 0; }

Не совпадает:

// catch () {}
/* catch () {} */
catch (...){ int i = 0;}
catch (...){ 
int i = 0;}
catch (...){int i = 0;
}
catch (...){ 
// Comment
int i = 0;}
catch (...){ int i = 0; // Comment}

Ответ 4

У вас есть ReSharper? Это должно освежить проблемы, обнаруженные в коде.

Ответ 5

Вот регулярное выражение, которое находит также блоки catch с комментариями внутри:

catch:b*\([^)]*\)[:b\n]*\{([:b\n]|(\/\*[^*]*\*\/)|(//[^\n]*))*\}

Ответ 6

Спасибо Stefan за предложение Regex. Я обнаружил, что предлагаемое регулярное выражение не находит блоки catch, где исключение не указано, то есть:

catch { }

Я слегка изменил Stefan, чтобы исключить опцию исключения:

catch:b*(\([^)]*\))*:b*\{:b*\}

Ответ 7

Нажмите Ctrl + Shift + F. Развернуть параметры поиска. Проверить использование регулярных выражений Вставьте это регулярное выражение.

catch\s*(\(\s*Exception(\s*\w+)?\))?\s*\{\s*\}

Ответ 8

Расширяя ответ @bobah75, он не узнает эту строку

catch (System.Data.Entity.Core.EntityException ex)
{
}

Итак, чтобы исправить это, вот решение

catch\s*(\(?.+Exception(\s*\w+)?\))?\s*\{\s*([:b\n]|(\/\*[^*]*\*\/)|(//[^\n]*))*\}

Вы можете проверить это здесь

Ответ 9

Если вы можете, я бы предложил использовать Sonar Analyzer. Вы можете добавить его через менеджер NuGet в Visual Studio.

Он покажет все неиспользуемые блоки catch, а также покажет вам, что с ним делать, что-то в строках: "Реализуйте или прокомментируйте, почему пусто".

Кроме того, он покажет вам гораздо больше возможных проблем с кодом.