.Net异常偷看。(更新)

时间:2009-05-06 09:06:06

标签: .net exception

尝试
    {
        抛出新的例外(“测试”);
    }
    最后
    {
        //检查异常????
        //日志(例外);
    }

有没有办法从最终的运行时间中获取异常?
我不能使用捕获: - )

感谢您的回答 我不能使用catch,因为它实际上不是我的代码(重构) 我们想要包装一段代码:

using(CriticalFlow(policy))  
{  
   //Not my code.  
   flow.Succeeded();  
}  

在CriticalFlow finally块中,我们需要检查异常,如果没有调用则成功,并以任何方式提醒任何人。
我希望它能为原来的问题提供一些启示。

再次感谢。

7 个答案:

答案 0 :(得分:7)

Exception helper;

try
{

}
catch (Exception ex)
{
    helper = ex;
}
finally
{
   if (helper != null)
   {
      process helper
   }
}

答案 1 :(得分:4)

当你到达finally块时,异常实例已经超出范围。使用try块的整个想法是有一个位置来检查异常。如果你不想抓住它,你可以做的就是简单地重新抛出它:

try
{
    // some exception is thrown
}
catch (Exception ex)
{
    // do some logging or so
    throw;
}

答案 2 :(得分:2)

不,你不能。如果你可以修改你可以编写的其余代码:

Exception e = null;
try
{
    e = new Exception("test");
    throw e;
}
finally
{
    // Examine e
}

但你不能“正常”做任何事情。

你能用记录方法包装整个东西吗?代表们可以在这里提供帮助,例如

LogExceptions(delegate
    {
        try
        {
            throw new Exception("test"0;
        }
        finally
        {
            // Not logged yet
        }
    }
);

LogExceptions只会尝试指定的操作,捕获任何异常,记录并重新抛出。

答案 3 :(得分:0)

不,异常会在堆栈中抛出,直到它被一个catch块捕获。

为什么你不能使用捕获? :? 您可以捕获想要用它执行的异常,并在需要时重新抛出它。

答案 4 :(得分:0)

我很抱歉,但这是不可能的......

答案 5 :(得分:0)

不,您无法直接访问finally块中的异常对象。但是,您可以做的是在catch块中捕获异常,将其存储在局部变量中,然后使用throw;语句重新抛出它。

答案 6 :(得分:0)

此代码可以澄清我们的意图:

using (CriticalFlow cf = new CriticalFlow())
            {
                // code which can throws
                cf.Completed();
            }

public class CriticalFlow : IDisposable
    {
        private bool _completed = false;

        public void Completed()
        {
            this._completed = true;
        }

        #region IDisposable Members

        public void Dispose()
        {
            if (this._completed == false)
            {
               // can i peek the exception at this point?
            }
        }

        #endregion
    }