小编典典

"throw" and "throw ex"?有区别吗?

all

有一些帖子询问这两者之间的区别是什么。
(为什么我还要提这个……)

但是我的问题在某种程度上是不同的,我在另一种类似错误 的上帝般的 处理方法中称其为“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在中使用Main,那么我将使用throw;重新抛出错误。但是在上面的简化代码中,所有异常都会通过HandleException

内部调用时是否throw ex;与调用具有相同的效果?throw``HandleException


阅读 85

收藏
2022-03-11

共1个答案

小编典典

是,有一点不同;

  • throw ex重置堆栈跟踪(因此您的错误似乎源自HandleException
  • throw不会 - 原始罪犯将被保留。

    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;
    }
    }

2022-03-11