【问题标题】:one main try catch in method calling methods that don't implement a try-catch一个主要的 try catch 方法调用不实现 try-catch 的方法
【发布时间】:2010-10-12 12:05:04
【问题描述】:

我有一个方法doSomething(),它有一个try catch 块,我在其中调用另一个方法。

    public void doSomething()  
    {  
       try
        {
            doSomethingElse();
        }
        catch
        {
            // catch implementation goes here
        }

    } 

在其他方法doSomethingElse() 我没有任何 try catch 块。我依靠 main 方法的 try-catch 来处理异常。如果doSomethingElse() 中有任何异常,它们将被冒泡到方法 doSomething 的 try-catch 块中。

这种方法有什么问题吗?

感谢您的宝贵时间。

【问题讨论】:

  • 不,没有错。
  • 一个建议:如果您的 doSomething() 方法仅用于在 try/catch 中执行 doSomethingElse() 方法,我会将 doSomethingElse() 方法设为私有,以便 API 调用者可以只调用捕获异常的方法。
  • 一个大错误是完全吞下抛出的异常。确保您相应地处理它们,可能首先捕获业务(如果有的话由doSomethingElse 抛出),并在需要时最终处理其他的。

标签: c# exception exception-handling


【解决方案1】:

这是完全合法的。

让异常出现在您可以/知道如何处理它们的地方。

最好不要在代码中乱扔不添加任何内容的 try/catch 块。

但是,使用空的 catch 块不好的做法(尽管我假设您发布的代码是省略了 catch 块代码的简化版本)。

【讨论】:

    【解决方案2】:

    没有错。

    正如其他人所说,不要吞下异常。最好不要抛出 new 异常;相反,只是catch (Exception)throw 它。当然,也应该注意尽量有例外,不要只使用默认的Exception

    【讨论】:

    • 谢谢。在 doSomethingElse();我也没有使用 throw 语句。因为它在 doSomething(); 中被调用;方法,我希望它会被 doSomething() 方法的 try-catch 块捕获。
    • 是的,这很好,因为您在 doSomethingElse 中没有 try/catch。当您想将错误从一个 try/catch 传播到堆栈中较低的方法中的 try/catch 时,异常会被吞没,但您根本不抛出它。然后问题就出现了;)
    【解决方案3】:

    很臭。捕获异常需要您恢复程序状态,就好像从未调用过 doSomethingElse() 一样。这在很大程度上取决于该方法的作用,但编写一个没有任何副作用的方法通常是非常不寻常的。如果有,则需要取消这些副作用。只有 doSomethingElse() 可以这样做,doSomething() 方法无法猜测实际执行了多少这些副作用。因此不能可靠地恢复状态。

    当您捕获所有异常时尤其如此。你也会抓住那些讨厌的。像 AccessViolation 或 FatalExecutionEngineError 一样,使 CLR 本身处于未知状态的异常,您永远无法恢复。接下来发生的事情是完全不可预测的。仅当您很幸运时,您才会获得一系列额外的例外。诊断他们是不可能的,你丢掉了有价值的信息。

    【讨论】:

      【解决方案4】:

      这是好的,但你忘了;之后doSomethingElse()

      【讨论】:

      • SO 没有编译器,所以我认为它不会在这里关心 :)
      猜你喜欢
      • 2012-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-19
      • 1970-01-01
      相关资源
      最近更新 更多