这里有个有趣的问题。我有一个系统试图运行一些初始化代码。如果它失败了,我们调用去初始化器来清理所有的东西。
因为我们在异常处理中调用了去初始化器,所以我们会面临初始化和重新初始化都会失败的风险,而且假设情况下,现在看来我们必须抛出两个异常。
不过,我们似乎不太可能会这么做。那么在这里发生了什么,代码应该做什么呢?
try { /* init code here */ }
catch (Exception ex)
{
try
{
_DeinitializeEngine();
}
catch (Exception ex2)
{
throw new OCRException("Engine failed to initialize; ALSO failed to deinitialize engine!", ex2);
}
finally
{
throw new OCRException("Engine failed to initialize; failed to initialize license!", ex);
}
}发布于 2008-12-15 16:32:28
如果清理代码失败,并且不能将应用程序保持在干净和已知的状态,我会让异常不被处理(或者用UnhandledException事件来记录它),然后关闭应用程序。
因为如果您不能处理第一个异常,那么捕获第二个异常有什么意义?
发布于 2008-12-15 15:56:14
你不应该再扔最后一块了。相反,使用InnerException在抛出中添加信息。
更新
您必须做的是捕获并重新抛出异常的“历史记录”,这是用InnerException完成的。当出现新异常时,您可以编辑它。这是我刚刚编写的代码片段,用来说明我在下面所有注释中解释的想法。
static void Main(string[] args)
{
try
{
principalMethod();
}
catch (Exception e)
{
Console.WriteLine("Test : " + e.Message);
}
Console.Read();
}
public static void principalMethod()
{
try
{
throw new Exception("Primary");
}
catch (Exception ex1)
{
try
{
methodThatCanCrash();
}
catch
{
throw new Exception("Cannot deinitialize", ex1);
}
}
}
private static void methodThatCanCrash()
{
throw new NotImplementedException();
}不需要使用双掷和终结。如果在Console.WriteLine(.)处放置一个断点。您会注意到,您拥有所有的异常跟踪。
发布于 2008-12-15 16:29:27
如果我正确理解你的问题,我会这样做:
try { /* init code here */ }
catch (Exception ex)
{
// Passing original exception as inner exception
Exception ocrex = new OCRException("Engine failed to initialize", ex);
try
{
_DeinitializeEngine();
}
catch (Exception ex2)
{
// Passing initialization failure as inner exception
ocrex = new OCRException("Failed to deinitialize engine!", ocrex);
}
throw ocrex;
}https://stackoverflow.com/questions/368786
复制相似问题