2010-03-04 82 views
0

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

回答

2

首先,你应该问自己,如果你真的想要赶上Exception。如果你不能处理这个异常,你不应该抓住它。

如果您确实想要捕捉到所有目的异常并在您的catch块之间共享某种处理,那么重复代码并不是正确的方法。为什么不将处理封装在方法中并从两个块调用?

+0

不幸的是(或者幸运的是)这不是我的代码,所以重写Exception catch块不在我的范围之内。 目前唯一的“处理”是显示带有例外消息的MessageBox,因此,现在将其提取到自己的方法可能是矫枉过正的。 – Rawling 2010-03-04 09:35:55

+0

在这种情况下,听起来应该删除一般的异常处理,并让异常冒泡到捕获所有处理程序或简单地让应用程序崩溃。 – 2010-03-04 09:40:27

+0

我的意思是,根据前面的人来说,一般的异常捕捉是正确的,这不是我尝试重写它的地方! 最后修复:删除特定的异常catch块并简单地检查一般块内异常的类型。没有代码重复,因为我们正在寻找特定的异常,而不是特定类型的异常,所以更有意义。 – Rawling 2010-03-04 12:10:42

1

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

虽然可以将它重新抛入异常块并让调用函数处理它,但不能将异常向下放到catch块中。

1

假设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抛出了一个消息(如使用空构造创建的ArgumentException的),它将一个ArgumentExeption由第一条Catch语句处理。所有其他异常将由第二个Catch语句处理,包括具有空消息的ArgumentException。我假设如果VB.NET可以做到这一点,C#可以(但假设可能是非常错误的)。

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

+0

这正是我想要做的!不幸的是,似乎C#不支持这一点。 – Rawling 2010-03-04 09:37:12