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
。但它不是一般的异常类型。不是 IOException
或 Exception
。那么为什么它仍然会触发 CA1031
?
那么 catch(FileNotFoundException)
和 catch(FileNotFoundException ex)
除了我不捕获异常信息之外还有区别吗?
我有两篇文章作为异常处理的基础:
- https://blogs.msdn.microsoft.com/ericlippert/2008/09/10/vexing-exceptions/
- https://www.codeproject.com/Articles/9538/Exception-Handling-Best-Practices-in-NET
当我注意到异常处理错误时,我也经常 link。
FileNotFound 明明是外生Exception,捕获是正确的。然而,这些文章还告诉我们,作为一般规则,始终 记录或公开 这些异常。理想情况下 Exception.ToString() 的结果。如果您没有办法引用捕获的异常,您怎么能做这两个中的任何一个呢?您只能给出一般错误消息,但有了 none 的详细信息,您实际上需要调试它.
虽然在很多情况下您只想将异常类型公开给 用户,但绝不会出现您只想 log 异常类型。 linked 文章明确提到了这一点,但由于反对票和评论,我似乎有必要重复这一点。
因此,如果它是 bug 或 feature,那么这是争论仍在继续的情况之一。
对我来说,它更像是一个功能。如果我在您的代码中看到它,我肯定会称您为潜在问题。它可以避免您记录不足。如果在 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;这是 FxCop
的 Roslyn
问题。
修复:
只需更新最新的 FxCop 分析器包,它就会正常运行。
NuGet:
Install-Package Microsoft.CodeAnalysis.FxCopAnalyzers -Version 2.9.7
参考资料:
CA1031
因此这段代码会触发 CA1031
。
try
{
// logic
}
catch (FileNotFoundException) // exception type
{
// handle error
}
虽然这个没有:
try
{
// logic
}
catch (FileNotFoundException ex) // exception var
{
// handle error
}
因为异常类型是有意义的,所以我不需要第一个例子中的ex
。但它不是一般的异常类型。不是 IOException
或 Exception
。那么为什么它仍然会触发 CA1031
?
那么 catch(FileNotFoundException)
和 catch(FileNotFoundException ex)
除了我不捕获异常信息之外还有区别吗?
我有两篇文章作为异常处理的基础:
- https://blogs.msdn.microsoft.com/ericlippert/2008/09/10/vexing-exceptions/
- https://www.codeproject.com/Articles/9538/Exception-Handling-Best-Practices-in-NET
当我注意到异常处理错误时,我也经常 link。
FileNotFound 明明是外生Exception,捕获是正确的。然而,这些文章还告诉我们,作为一般规则,始终 记录或公开 这些异常。理想情况下 Exception.ToString() 的结果。如果您没有办法引用捕获的异常,您怎么能做这两个中的任何一个呢?您只能给出一般错误消息,但有了 none 的详细信息,您实际上需要调试它.
虽然在很多情况下您只想将异常类型公开给 用户,但绝不会出现您只想 log 异常类型。 linked 文章明确提到了这一点,但由于反对票和评论,我似乎有必要重复这一点。
因此,如果它是 bug 或 feature,那么这是争论仍在继续的情况之一。
对我来说,它更像是一个功能。如果我在您的代码中看到它,我肯定会称您为潜在问题。它可以避免您记录不足。如果在 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;这是 FxCop
的 Roslyn
问题。
修复: 只需更新最新的 FxCop 分析器包,它就会正常运行。
NuGet:
Install-Package Microsoft.CodeAnalysis.FxCopAnalyzers -Version 2.9.7
参考资料: CA1031