如何抛出异常

时间:2016-08-18 14:01:48

标签: c# exception c#-4.0 try-catch throw

<setAdmin Id="2"> <Type>7</Type> <size>40</size> <assets> <asset id="24"> <entity>PNR</entity> </asset> </assets> </setAdmin> <setAdmin Id="2"> <assets> <asset id="24"> <entity>PNR</entity> </asset> </assets> <Type>7</Type> <size>40</size> </setAdmin> 之间进行选择的最佳做法是什么?有没有?关于 - 例如 - 这个简单的片段:

throw;

更新 我知道上面的两个区别。问题是如何决定使用其中之一?有没有做出更好选择的最佳做法?

2 个答案:

答案 0 :(得分:8)

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

如果您没有任何其他信息,请使用throw;

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

答案 1 :(得分:1)

非常simple

您是否希望保持堆栈跟踪以准确查看异常发生的位置?然后使用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是对应的 - 有些信息是隐藏,但也许你想隐藏它,谁知道?