首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >孪生例外的奥秘

孪生例外的奥秘
EN

Stack Overflow用户
提问于 2008-12-15 15:52:53
回答 4查看 311关注 0票数 1

这里有个有趣的问题。我有一个系统试图运行一些初始化代码。如果它失败了,我们调用去初始化器来清理所有的东西。

因为我们在异常处理中调用了去初始化器,所以我们会面临初始化和重新初始化都会失败的风险,而且假设情况下,现在看来我们必须抛出两个异常。

不过,我们似乎不太可能会这么做。那么在这里发生了什么,代码应该做什么呢?

代码语言:javascript
复制
      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);
         }
      }
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2008-12-15 16:32:28

如果清理代码失败,并且不能将应用程序保持在干净和已知的状态,我会让异常不被处理(或者用UnhandledException事件来记录它),然后关闭应用程序。

因为如果您不能处理第一个异常,那么捕获第二个异常有什么意义?

票数 1
EN

Stack Overflow用户

发布于 2008-12-15 15:56:14

你不应该再扔最后一块了。相反,使用InnerException在抛出中添加信息。

更新

您必须做的是捕获并重新抛出异常的“历史记录”,这是用InnerException完成的。当出现新异常时,您可以编辑它。这是我刚刚编写的代码片段,用来说明我在下面所有注释中解释的想法。

代码语言:javascript
复制
    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(.)处放置一个断点。您会注意到,您拥有所有的异常跟踪。

票数 8
EN

Stack Overflow用户

发布于 2008-12-15 16:29:27

如果我正确理解你的问题,我会这样做:

代码语言:javascript
复制
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;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/368786

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档