Exception.Data和异常处理问题

时间:2009-09-11 04:21:33

标签: c# exception

我有几个关于例外的问题。

1)当你碰到一个挡块时,吞咽意味着什么?我认为它总是被重新抛出,或者现有的异常被传递到下一个catch块。

2)如果你将Exception.Data值添加到例外,我注意到我必须再做一次;稍后在另一个捕获块中进一步获取该数据。为什么呢?

3 个答案:

答案 0 :(得分:3)

吞下异常就意味着抓住它并且不做任何有用的事情。您可能会看到一个常见的事情:

try
{
     DoSomeOperationThatMightThrow();
}
catch (Exception ex) // don't do this!
{
     // exception swallowed
}

您通常根本不想捕获基本Exception,最好捕获并处理特定的Exception类型,理想情况下,您应该只捕获异常类型,您可以在代码级别执行某些有用的操作在复杂的应用程序中,这可能很棘手,因为您可能在代码中的不同级别处理不同的错误。最高级别的代码可能只捕获严重/致命的异常,较低级别可能会捕获可以通过某些错误处理逻辑处理的异常。

如果您确实发现异常并需要重新抛出异常,请执行以下操作:

try
{
     DoSomething();
}
catch (SomeException ex)
{
     HandleError(...);

     // rethrow the exception you caught
     throw;

     // Or wrap the exception in another type that can be handled higher up.
     // Set ex as the InnerException on the new one you're throwing, so it
     // can be viewed at a higher level.
     //throw new HigherLevelException(ex);

     // Don't do this, it will reset the StackTrace on ex,
     // which makes it harder to    track down the root issue
     //throw ex;
}

答案 1 :(得分:2)

  1. 吞下异常通常意味着为异常设置一个处理块,但在块中没有做任何事情。例如:

    尝试{3/0; } catch DivideByZeroException {// ignore} //注意:我知道这真的不会编译,因为编译器非常聪明,不能让你除以const为0.

  2. 您必须重新抛出,因为异常的第一个处理程序是唯一将执行的处理程序。

  3. 如果您希望异常冒泡,您可以不处理它或重新抛出它。顺便说一句,重要的是要注意在.NET中只是说“抛出”你将保留堆栈跟踪。如果你“抛出异常”,你将失去堆栈跟踪。

答案 2 :(得分:1)

好的,您可以处理异常,直到调用堆栈,您可以执行以下操作:


    public class A
    {
        public void methodA()
        {
            try
            {
            }
            catch(Exception e)
            {
                 throw new Exception("Some description", e);
            }
        }
    }

    public class B
    {
        public void methodB()
        {
            try
            {
                 A a = new A();
                 a.methodA();
            }
            catch(Exception e)
            {
                //...here you get exceptions
            }
        }
    }