有一些帖子问这两者之间已经有什么区别了。(为什么我要提这个…)
但我的问题在某种程度上是不同的,我在另一种错误处理方法中调用了“throw ex”。
public class Program {
public static void Main(string[] args) {
try {
// something
} catch (Exception ex) {
HandleException(ex);
}
}
private static void HandleException(Exception ex) {
if (ex is ThreadAbortException) {
// ignore then,
return;
}
if (ex is ArgumentOutOfRangeException) {
// Log then,
throw ex;
}
if (ex is InvalidOperationException) {
// Show message then,
throw ex;
}
// and so on.
}
}
如果在主线中使用try和catch,那么我会使用throw;重新抛出错误。
但是在上面的简单代码中,所有异常都通过HandleException
是否抛出前任;在HandleException内部调用时,与调用throw有相同的效果?
看这里:http://blog-mstechnology.blogspot.de/2010/06/throw-vs-throw-ex.html
把:
try
{
// do some operation that can fail
}
catch (Exception ex)
{
// do some local cleanup
throw;
}
它保留了异常堆栈信息
这叫做"重扔"
如果想要抛出新的异常,
throw new ApplicationException("operation failed!");
把交货:
try
{
// do some operation that can fail
}
catch (Exception ex)
{
// do some local cleanup
throw ex;
}
它不会发送异常堆栈信息
这叫做“打破堆栈”
如果想要抛出新的异常,
throw new ApplicationException("operation failed!",ex);
让我们来理解throw和throw ex之间的区别。我听说在很多。net面试中这个常见的问题被问到。
简单介绍一下这两个术语,throw和throw ex都用于理解异常发生的位置。Throw ex重写异常的堆栈跟踪,而不考虑实际抛出的位置。
让我们通过一个例子来理解。
让我们先理解投掷。
static void Main(string[] args) {
try {
M1();
} catch (Exception ex) {
Console.WriteLine(" -----------------Stack Trace Hierarchy -----------------");
Console.WriteLine(ex.StackTrace.ToString());
Console.WriteLine(" ---------------- Method Name / Target Site -------------- ");
Console.WriteLine(ex.TargetSite.ToString());
}
Console.ReadKey();
}
static void M1() {
try {
M2();
} catch (Exception ex) {
throw;
};
}
static void M2() {
throw new DivideByZeroException();
}
上面的输出如下。
显示完整的层次结构和方法名称,实际上已经抛出异常。它是M2 -> M2。还有行号
其次……让我们理解throw ex。只需在M2方法catch块中将throw替换为throw ex。如下。
throw ex代码的输出如下。
你可以在输出中看到差异。Throw ex只是忽略了之前的所有层次结构,并使用写入Throw ex的line/method重置堆栈跟踪。