重新区别

假设我在两个不同的程序集中有以下两个类:

//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

上一篇: The difference between re

下一篇: Stack and heap memory of a C program