多次异常捕获

时间:2012-06-26 16:12:35

标签: c# exception exception-handling

是否可以在同一个catch块中捕获多个异常?

try
{   }
catch(XamlException s | ArgumentException a)
{   }

5 个答案:

答案 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好。