我有几个关于例外的问题。
1)当你碰到一个挡块时,吞咽意味着什么?我认为它总是被重新抛出,或者现有的异常被传递到下一个catch块。
2)如果你将Exception.Data值添加到例外,我注意到我必须再做一次;稍后在另一个捕获块中进一步获取该数据。为什么呢?
答案 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)
吞下异常通常意味着为异常设置一个处理块,但在块中没有做任何事情。例如:
尝试{3/0; } catch DivideByZeroException {// ignore} //注意:我知道这真的不会编译,因为编译器非常聪明,不能让你除以const为0.
您必须重新抛出,因为异常的第一个处理程序是唯一将执行的处理程序。
如果您希望异常冒泡,您可以不处理它或重新抛出它。顺便说一句,重要的是要注意在.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
}
}
}