有一些帖子问这两者之间已经有什么区别了。(为什么我要提这个…)
但我的问题在某种程度上是不同的,我在另一种错误处理方法中调用了“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有相同的效果?
让我们来理解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重置堆栈跟踪。
微软文档代表:
Once an exception is thrown, part of the information it carries is the stack trace. The stack trace is a list of the method call hierarchy that starts with the method that throws the exception and ends with the method that catches the exception. If an exception is re-thrown by specifying the exception in the throw statement, the stack trace is restarted at the current method and the list of method calls between the original method that threw the exception and the current method is lost. To keep the original stack trace information with the exception, use the throw statement without specifying the exception.
来源:https://learn.microsoft.com/en-us/dotnet/fundamentals/code-analysis/quality-rules/ca2200