重新区别
假设我在两个不同的程序集中有以下两个类:
//in assembly A
public class TypeA {
// Constructor omitted
public void MethodA
{
try {
//do something
}
catch {
throw;
}
}
}
//in assembly B
public class TypeB {
public void MethodB
{
try {
TypeA a = new TypeA();
a.MethodA();
}
catch (Exception e)
//Handle exception
}
}
}
在这种情况下,MethodA中的try-catch只会提升异常,但并不真正处理它。 在MethodA中使用try-catch是否有优势? 换句话说,这种try-catch模块与不使用模块之间有什么不同?
在你的例子中,这没有任何好处。 但有些情况下,只需要鼓励一个特定的例外。
public void Foo()
{
try
{
// Some service adapter code
// A call to the service
}
catch (ServiceBoundaryException)
{
throw;
}
catch (Exception ex)
{
throw new AdapterBoundaryException("some message", ex);
}
}
这使您可以轻松识别发生异常的边界。在这种情况下,您需要确保只针对特定于边界的代码抛出边界异常。
是,有一点不同。 当你捕获一个异常时,.NET假定你将以某种方式处理它,堆栈被解开,直到捕获的功能。
如果你没有捕获它,最终会以一个未处理的异常结束,它将调用某种诊断(如调试器或异常记录器),完整的堆栈及其在实际故障点的状态将可供检查。
因此,如果你捕获然后重新抛出一个不在其他地方处理的异常,你可以抢夺关于实际发生的真正有用信息的诊断工具。
原样,第一个选项看起来很糟糕(或者应该是'无用'?)的想法。 但是,这样做很少。 通常在两种情况下从Catch块内重新抛出异常:
一个。 您想检查为数据生成的异常,并有条件地将其展开到堆栈中。
try
{
//do something
}
catch (Exception ex)
{
//Check ex for certain conditions.
if (ex.Message = "Something bad")
throw ex;
else
//Handle the exception here itself.
}
湾 组件中出现了不可接受的情况,这些信息需要传递给调用代码(通常通过附加一些其他有用的信息或将其包装在另一个异常类型中)。
try
{
//do something
}
catch (StackOverflowException ex)
{
//Bubble up the exception to calling code
//by wrapping it up in a custom exception.
throw new MyEuphemisticException(ex, "Something not-so-good just happened!");
}
链接地址: http://www.djcxy.com/p/79849.html