问题描述
有一些帖子询问这两者之间的区别是什么.
(我为什么还要提这个……)
There are some posts that asks what the difference between those two are already.
(why do I have to even mention this...)
但我的问题有所不同,我在另一个错误上帝般处理方法中调用throw ex".
But my question is different in a way that I am calling "throw ex" in another error god-like handling method.
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. } }
如果 尝试 &在 Main 中使用了 catch,然后我将使用 throw; 重新抛出错误.但是在上面的简化代码中,所有的异常都经过HandleException
If try & catch were used in the Main, then I would use throw; to rethrow the error. But in the above simplied code, all exceptions go through HandleException
throw ex; 在 HandleException 内部调用时是否与调用 throw 效果相同?
Does throw ex; has the same effect as calling throw when called inside HandleException?
推荐答案
是的,有区别;
- throw ex 重置堆栈跟踪(因此您的错误似乎源自 HandleException)
throw 不会 - 原始违规者将被保留.
- throw ex resets the stack trace (so your errors would appear to originate from HandleException)
throw doesn't - the original offender would be preserved.
static void Main(string[] args) { try { Method2(); } catch (Exception ex) { Console.Write(ex.StackTrace.ToString()); Console.ReadKey(); } } private static void Method2() { try { Method1(); } catch (Exception ex) { //throw ex resets the stack trace Coming from Method 1 and propogates it to the caller(Main) throw ex; } } private static void Method1() { try { throw new Exception("Inside Method1"); } catch (Exception) { throw; } }