C#:查找所有空的捕捉块

C#:查找所有空的捕捉块,c#,visual-studio,C#,Visual Studio,我正在复习一些代码 catch:b*\([^)]*\)[:b\n]*\{([:b\n]|(\/\*[^*]*\*\/)|(//[^\n]*))*\} 我注意到一些空的挡块。这不是一个好主意,因为有些东西不起作用,你看不出原因 catch:b*\([^)]*\)[:b\n]*\{([:b\n]|(\/\*[^*]*\*\/)|(//[^\n]*))*\} 有没有一种简单的方法可以在解决方案中找到所有空的try-catch块?有吗?这将点亮代码中发现的问题。将找到这些问题以及许多其他潜在问题。使

我正在复习一些代码

catch:b*\([^)]*\)[:b\n]*\{([:b\n]|(\/\*[^*]*\*\/)|(//[^\n]*))*\}
我注意到一些空的挡块。这不是一个好主意,因为有些东西不起作用,你看不出原因

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

有没有一种简单的方法可以在解决方案中找到所有空的try-catch块?

有吗?这将点亮代码中发现的问题。

将找到这些问题以及许多其他潜在问题。

使用“全局查找”对话框,打开正则表达式,然后搜索:

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

下面是一个正则表达式,它还可以查找内部只有注释的catch块:

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

感谢Stefan的Regex建议。我发现建议的正则表达式没有找到未指定异常的catch块,即:

catch:b*\([^)]*\)[:b\n]*\{([:b\n]|(\/\*[^*]*\*\/)|(//[^\n]*))*\}
catch { }
我稍微调整了Stefan的,使异常括号成为可选的:

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

扩展已接受的答案,以满足下面描述的所有条件。 为Visual Studio 2017/2019更新,C++和C++的作品。
catch:b*\([^)]*\)[:b\n]*\{([:b\n]|(\/\*[^*]*\*\/)|(//[^\n]*))*\}
使用“查找”对话框(CTRL+SHIFT+F),打开正则表达式并搜索:

catch:b*\([^)]*\)[:b\n]*\{([:b\n]|(\/\*[^*]*\*\/)|(//[^\n]*))*\}
^(?!\/\/|\/\*).*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}
匹配:

catch:b*\([^)]*\)[:b\n]*\{([:b\n]|(\/\*[^*]*\*\/)|(//[^\n]*))*\}
^(?!\/\/|\/\*).*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}
不匹配:

catch:b*\([^)]*\)[:b\n]*\{([:b\n]|(\/\*[^*]*\*\/)|(//[^\n]*))*\}
^(?!\/\/|\/\*).*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}
按Ctrl+Shift+F。 展开“查找选项”。 选中“使用正则表达式” 粘贴这个正则表达式

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

扩展@bobah75的答案,它不会识别这一行

catch:b*\([^)]*\)[:b\n]*\{([:b\n]|(\/\*[^*]*\*\/)|(//[^\n]*))*\}
catch (System.Data.Entity.Core.EntityException ex)
{
}
为了解决这个问题,这里有一个解决方案

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

您可以测试它

如果可以,我建议使用。您可以通过VisualStudio中的NuGet manager添加它

catch:b*\([^)]*\)[:b\n]*\{([:b\n]|(\/\*[^*]*\*\/)|(//[^\n]*))*\}
它将显示所有未使用的catch块,并向您显示如何使用它的提示,例如:“implementor comment why empty”

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


此外,它还将向您展示更多可能的代码问题。

我还没有在ReSharper中找到解决此问题的位置或方法。。。你会怎么做?它在ReSharper中显示为警告,但我认为你必须打开代码文件才能看到它。奇怪的是,前几天我在一些代码中发现了其中一个。我们同时使用FxCop和ReSharper;有人明确禁止了FxCop警告(因此它没有出现在持续集成构建中),而忽略了ReSharper警告。对此你无能为力要在构建中找到它们,有很多方法可以显式地抑制它们,但它们最好有一个很好的理由这样做。但是,如果没有详细的代码检查,很难找到它们。我正在做这样的评论,找到这些使用Sverrir正则表达式的家伙帮了大忙!仅供参考-并非所有空的捕捉块都是坏的。有时,开发人员准确地捕获某个特定的异常,以便可以忽略该异常。@马特,谢谢,同意您的意见,但我们有一条规则,开发人员必须在其中添加注释,以确认它是有意完成的。@马特-但是捕获(异常)几乎总是不好的。您能在这里发布您的变体吗?我也是这个主题的Intreset,但不在正则表达式中;-)此外,仅供参考-有时库将允许调用用户函数。空的“Catch”语句是防止这些用户提供的函数(可能引发任何异常)终止库中剩余进程的唯一方法。FxCop或ReSharper如果只是空的try/Catch,那就太过分了,好主意!上面的答案对我不起作用,但它确实“捕获((.*Exception.*)*:Wh*\{:Wh*\}”而没有引号。是的。这个答案实际上与空捕获不匹配@Ghost的工作原理是这样的。只有当catch块没有任何内容时,答案才会起作用,但是catch块只包含注释掉的代码怎么办?除非我将
:b
替换为
\s
,否则正则表达式对我不起作用。(VS 2017)你能说出捕获空捕获块的规则吗?我添加了详细信息来回答。格式不正确的表达式,至少在VS 2017Thank@jjxtra中是这样的。我已经更新了答案,以便在更现代的VS版本上工作。还详细说明了它匹配/不匹配的条件。你太好了,大多数人都不愿意花时间
catch:b*\([^)]*\)[:b\n]*\{([:b\n]|(\/\*[^*]*\*\/)|(//[^\n]*))*\}