在某些情况下,我只想调用某个方法来做一些工作,而不关心处理它可能抛出的所有特定异常。相反,我真正关心的是该方法是否成功。
我将提供一个 .NET / C# 示例。假设我有一个要复制的文件,我真正关心的是复制操作是否成功。如果复制失败,我不在乎特定异常是 FileNotFoundException 还是 IOException“磁盘空间不足”异常或其他异常……在这种情况下,我的应用程序将正常运行,因为此操作并不重要。
因此,如何实现这一点的想法是:
try
{
// try
System.IO.File.Copy(strFile, strFile + ".new");
}
catch (Exception ex)
{
// if critical exception then rethrow
if (IsCritical(ex))
throw;
// else just log and swallow...
Console.WriteLine("Failed to copy the file: " + ex.Message);
}
其中 IsCritical(Exception ex) 是定义为的辅助方法:
public static bool IsCritical(Exception ex)
{
if (ex is OutOfMemoryException) return true;
if (ex is AppDomainUnloadedException) return true;
if (ex is BadImageFormatException) return true;
if (ex is CannotUnloadAppDomainException) return true;
if (ex is ExecutionEngineException) return true;
if (ex is InvalidProgramException) return true;
if (ex is System.Threading.ThreadAbortException)
return true;
return false;
}
此问题基于以下文章:C# 中的异常处理,并牢记“不要捕获您无法处理的异常”规则
这个想法是遵循异常处理最佳实践的主要规则: - 不要在不重新抛出的情况下捕获一般异常 - 只捕获你知道如何处理的异常 - (在这种情况下,我想以相同的方式处理它们......通过记录并继续应用程序逻辑)。
那么对于给定的场景,这是一个好方法吗?如果不是,为什么以及做什么会更好?