C# 捕获(FileNotFoundException)和 CA1031

C# catch(FileNotFoundException) and CA1031

因此这段代码会触发 CA1031

try
{
    // logic
}
catch (FileNotFoundException) // exception type
{
    // handle error
}

虽然这个没有:

try
{
    // logic
}
catch (FileNotFoundException ex) // exception var
{
    // handle error
}

因为异常类型是有意义的,所以我不需要第一个例子中的ex。但它不是一般的异常类型。不是 IOExceptionException。那么为什么它仍然会触发 CA1031?

那么 catch(FileNotFoundException)catch(FileNotFoundException ex) 除了我不捕获异常信息之外还有区别吗?

我有两篇文章作为异常处理的基础:

当我注意到异常处理错误时,我也经常 link。

FileNotFound 明明是外生Exception,捕获是正确的。然而,这些文章还告诉我们,作为一般规则,始终 记录或公开 这些异常。理想情况下 Exception.ToString() 的结果。如果您没有办法引用捕获的异常,您怎么能做这两个中的任何一个呢?您只能给出一般错误消息,但有了 none 的详细信息,您实际上需要调试它.

虽然在很多情况下您只想将异常类型公开给 用户,但绝不会出现您只想 log 异常类型。 linked 文章明确提到了这一点,但由于反对票和评论,我似乎有必要重复这一点。

因此,如果它是 bugfeature,那么这是争论仍在继续的情况之一。

对我来说,它更像是一个功能。如果我在您的代码中看到它,我肯定会称您为潜在问题。它可以避免您记录不足。如果在 catch 块的末尾写入 throw; ,则可以测试错误是否仍然存在。这将重新抛出异常,因此无法在此 ExceptionHandler 中引用异常并不重要。

So this code triggers CA1031

try
{
    // logic
}
catch (FileNotFoundException) // exception type
{
    // handle error
}

这是因为 "general exception such as System.Exception or System.SystemException is caught in a catch statement, or a general catch clause such as catch() is used"。要修复它,分配它并处理错误和/或重新抛出一般异常以便进一步处理它。

经进一步调查,似乎这个曾经是一个错误,你可以看到更多here;这是 FxCopRoslyn 问题。

修复: 只需更新最新的 FxCop 分析器包,它就会正常运行。

NuGet:

 Install-Package Microsoft.CodeAnalysis.FxCopAnalyzers -Version 2.9.7

参考资料: CA1031