如何抛出异常

本文关键字:抛出异常 | 更新日期: 2023-09-27 18:02:53

throw;throw ex;之间选择的最佳实践是什么?真的有吗?例如,下面这个简单的代码片段:

try{
    // some code
} catch (Exception ex) {
    // some catcher code
    // throw; ?
    // or
    // throw ex; ?
    // how to decide which one?
}

我知道上面两者的区别。我如何决定使用其中的一个?是否有最佳实践来做出更好的选择?

如何抛出异常

您应该使用throw;重新抛出原始异常(与原始堆栈跟踪)或使用throw new MyException(..., ex);抛出您自己的异常,可能提供额外的信息设置内部异常为ex

如果没有任何附加信息,请使用throw;

如果您只捕获异常进行清理,则使用try {...} finally {...}

很简单。

您是否希望保留堆栈跟踪以查看异常发生的确切位置?然后使用throw。这就像你根本不使用catch

你只关心当前方法的调试信息吗?然后使用throw ex

来演示:

static void Main(string[] args)
{
    try
    {
        Test();
    }
    catch (Exception e)
    {
        Console.WriteLine(e);
    }
}
static void Test()
{
    try
    {
        // long lambda chain
        new Action(() => new Action(() => new Action(() => { throw new InvalidOperationException(); })())())();
    }
    catch (Exception ex)
    {
        //throw;
        //throw ex;
    }
}

throw将保留堆栈跟踪:

System.InvalidOperationException: Operation is not valid due to the current state of the object.
    at ConsoleApplication.Program.<>c.<Test>b__1_2() in ConsoleApplication'Program.cs:line 22
    at ConsoleApplication.Program.<>c.<Test>b__1_1() in ConsoleApplication'Program.cs:line 22
    at ConsoleApplication.Program.<>c.<Test>b__1_0() in ConsoleApplication'Program.cs:line 22
    at ConsoleApplication.Program.Test() in ConsoleApplication'Program.cs:line 26
    at ConsoleApplication.Program.Main(String[] args) in ConsoleApplication'Program.cs:line 13

throw ex将重置堆栈跟踪:

System.InvalidOperationException: Operation is not valid due to the current state of the object.
    at ConsoleApplication.Program.Test() in ConsoleApplication'Program.cs:line 27
    at ConsoleApplication.Program.Main(String[] args) in ConsoleApplication'Program.cs:line 13

对于最佳实践,选择通常是throw。作为开发人员,您希望获得尽可能多的信息。throw ex是一个对应的——有些信息是隐藏的,但也许你想隐藏它,谁知道呢?