【问题标题】:How to throw an exception如何抛出异常
【发布时间】:2016-12-25 12:07:42
【问题描述】:

throw;throw ex; 之间进行选择的最佳做法是什么?有吗?例如,关于这个简单的 sn-p:

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

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

【问题讨论】:

  • 使用throw,这会保留原始堆栈跟踪。但是你为什么要抓住一个普遍的例外呢?在我看来你无法处理它,那为什么要抓住它呢?
  • @Maarten 它有时会发生。例如重试一些操作
  • @Sinatr 请查看更新。提前谢谢你。

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


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    It's very 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
    

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

    【讨论】:

      猜你喜欢
      • 2013-05-24
      • 2012-01-18
      • 1970-01-01
      • 2011-05-30
      • 1970-01-01
      • 1970-01-01
      • 2012-06-29
      • 2010-10-08
      相关资源
      最近更新 更多