【问题标题】:Pass exception from specific catch to less-specific catch将异常从特定捕获传递到不太特定的捕获
【发布时间】:2010-03-04 17:34:03
【问题描述】:

我目前在 try 块之后使用两个 catch 块。第一个捕获 SqlExceptions,第二个捕获异常。 如果 SqlException 没有特定消息,我希望它由通用 catch 块处理。有什么办法可以将异常从第一个 catch 块传递到第二个,还是必须复制代码?

【问题讨论】:

    标签: c# exception exception-handling c#-2.0


    【解决方案1】:

    首先你应该问自己是否真的想抓住Exception。如果您无法处理异常,则不应捕获它。

    如果您确实想捕获通用异常并在您的捕获块之间共享某种处理,则复制代码不是正确的方法。为什么不将处理封装在一个方法中并从两个块中调用呢?

    【讨论】:

    • 遗憾(或可能幸运)这不是我的代码,因此重写异常捕获块不在我的职权范围内。目前唯一的“处理”是显示带有异常消息的 MessageBox,因此,目前,将其提取到自己的方法中可能是矫枉过正。
    • 在这种情况下,听起来您应该删除一般异常处理并让异常冒泡到 catch all 处理程序,或者干脆让应用程序崩溃。
    • 我的意思是,根据我之前的人来说,一般的异常捕获是正确的,这不是我尝试重写它的地方!最终修复:删除特定的异常捕获块并简单地检查一般块内的异常类型。没有代码重复,而且更有意义,因为我们正在寻找特定的异常,而不是特定类型的异常。
    【解决方案2】:

    在这种情况下,您将不得不复制代码。

    您不能将异常冒泡到较低的 catch 块中,尽管您可以在异常块中重新抛出它并让调用函数处理它。

    【讨论】:

      【解决方案3】:

      假设 Catch 语句没有嵌套,这段代码在 VB.Net 中有效:

      Try
          SomeCode()
      Catch ex As ArgumentException When ex.Message <> ""
          Trace.WriteLine(String.Format("Caught argument exception with a message {0}", ex.Message))
      Catch ex As Exception
          Trace.WriteLine("Caught argument exception with no message, or some other type of exception")
      End Try
      

      如果 SomeCode 抛出带有消息的 ArgumentExeption(如使用空构造函数创建的 ArgumentException),它将由第一个 Catch 语句处理。所有其他异常将由第二个 Catch 语句处理,包括带有空消息的 ArgumentException。

      我假设如果 VB.NET 可以做到,C# 可以(但假设可能非常错误)。

      编辑:在 C# 中似乎没有等效的代码结构,正如here 所问的那样。对不起,如果我误导了。

      【讨论】:

      • 这正是我想做的!不幸的是,C# 似乎不支持这一点。
      猜你喜欢
      • 1970-01-01
      • 2012-11-11
      • 2018-06-28
      • 2017-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-17
      相关资源
      最近更新 更多