是否可以在同一个catch
块中捕获多个异常?
try
{ }
catch(XamlException s | ArgumentException a)
{ }
答案 0 :(得分:7)
是。如果你捕获一个超类,它也会捕获所有子类:
try
{
// Some code
}
catch(Exception e)
{
// ...
}
如果这比您想要的更多,那么您可以通过测试它们的类型来重新抛出您不想捕获的异常。如果您这样做,请小心使用throw;
语法,不 throw e;
。后一种语法破坏了堆栈跟踪信息。
但是你不能使用你提出的语法来捕捉两种不同的类型。
答案 1 :(得分:3)
不像你要求的那样简洁。一种方法是捕获所有异常并特别处理这两个异常:
catch(Exception e)
{
if((e is SystemException) || (e is ArgumentException))
// handle, rethrow, etc.
else
throw;
}
答案 2 :(得分:2)
然而,不是没有C#guru,这是任何oop语言的标准。
try
{
string s = null;
ProcessString(s);
}
// Most specific:
catch (InvalidCastException e) { out_one(e); }
catch (ArgumentNullException e) { out_two(e); }
// Least specific - anything will get caught
// here as all exceptions derive from this superclass
catch (Exception e)
{
// performance-wise, this would be better off positioned as
// a catch block of its own, calling a function (not forking an if)
if((e is SystemException) { out_two(); }
else { System..... }
}
答案 3 :(得分:1)
在vb.net中,可以说Catch Ex As Exception When IsMyException(Ex)
,其中IsMyException
是检查Ex
并决定是否捕获它的任何所需函数。在任何内部Ex
块运行之前确定是否捕获Finally
。不幸的是,C#的制造者不喜欢允许自定义异常过滤器的想法,可能是因为它会使用特定于平台的细节污染语言(大多数平台都不支持.net样式的异常过滤器)。因此,C#中最好的人可以做的事情就是:
void HandleThisOrThatException(BaseTypeOfThisThatTheOtherException) { ... } ... // Catch ThisException or ThatException, but not TheOtherException catch (ThisException ex) {HandleThisOrThatException(ex);} catch (ThatException ex) {HandleThisOrThatException(ex);}
答案 4 :(得分:0)
这是一个糟糕的例子,因为任何ArgumentException
也是SystemException
,所以抓住所有 SystemException
会隐式获得ArgumentException
s好。