gpt4 book ai didi

c# - 是否可以在某些场景中吞下除关键异常之外的所有异常?

转载 作者:IT王子 更新时间:2023-10-29 04:42:18 25 4
gpt4 key购买 nike

在某些情况下,我只想调用某个方法来做一些工作,而不关心处理它可能抛出的所有特定异常。相反,我真正关心的是方法是否成功。

我将提供一个 .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;
}

此问题基于以下文章:Exception Handling in C# with the "Do Not Catch Exceptions That You Cannot Handle" rule in mind

这个想法是遵循异常处理最佳实践的主要规则:- 不要在不重新抛出的情况下捕获一般异常- 只捕获您知道如何处理的异常 -(在这种情况下,我想以相同的方式处理它们......通过记录并继续应用程序逻辑)。

那么对于给定的场景,这是一个好的方法吗?如果不是,为什么会更好?

最佳答案

通常建议不要吞下异常的原因是它可以隐藏错误。例如,您正在执行 File.Copy 以外的操作:您也在执行字符串处理 (strFile + ".new")。这不能抛出(OOM 除外),但如果计算更复杂,您可能隐藏了一个错误

在这种情况下,您可能应该将所有计算移出 try block 。然后吞下任何异常就可以了。我有记录它们的习惯,以防万一我很小心还是犯了错误。

不要吞下不必要的东西的规则是为了保护开发人员免于犯错。如果您有理由确定一切都很好,那么您就不需要遵守规则。

关于c# - 是否可以在某些场景中吞下除关键异常之外的所有异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19903653/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com