1

这是我当前的异常处理代码。

请特别注意throw e;标有的行***

try
{
  //some code that could cause exception
}
catch (FaultException e) //first catch a particular type of exception only
{
  if (Regex.IsMatch(e.Message, "something")) //satisfying a particular condition
  {
    Console.WriteLine("Particular exception occurred.");
    return;
  }
  else
    throw e; // <-- *** Problem! Not getting caught by the "catch" below.
}
catch (Exception e) //catch all other exceptions
{
  Console.WriteLine("General exception ocurred");
  return;
}

问题是这样的:如果throw e; // <-- ***发生,它不会被 final 捕获catch。相反,应用程序会崩溃,就好像没有处理异常一样。

如何以最简单的方式解决这个问题?

您在第一个catch中看到我只对实际处理FaultException满足特定条件的异常感兴趣,但将所有其他异常(FaultException不满足条件的异常FaultException不满足条件的异常)留给 final catch。不幸的是,这不能正常工作。

我在.NET 4上。

4

4 回答 4

5

您不完全理解 try/catch 语法。您可以在一次尝试中附加多个捕获 - 最接近匹配的那个就是将被选中的那个。在这种情况下,FaultException 的 catch 将触发,然后永远不会调用更通用的 Exception,因为该异常已被处理。

您需要做的是将整个 try/catch 包装在另一个 try/catch 中,专门针对更一般的异常情况,如果您总是想处理它;要么重做你的逻辑。(例如,您可以将其简化为异常捕获,然后检查它是否为 FaultException。)

于 2012-11-10T02:28:03.047 回答
2

catch每个块只执行一个try块。

我会将catch块重写为:

catch (Exception e)
{
    if (e is FaultException && Regex.IsMatch(e.Message, "something"))
    {
        ....
    }
    else // all other exceptions
    {
        ....
    }
}
于 2012-11-10T02:30:55.403 回答
1

throw e永远不会被异常捕获在caught同一级别。

a 的throw内部总是catch会抛出给方法的调用者。

此外,如果您想重新抛出 dothrow而不是throw e. 第一种情况保留调用堆栈。

于 2012-11-10T02:33:41.013 回答
0

如果在 catch 块中抛出异常,它不会在同一个 try-catch 中被捕获。

您可以在 else 条件下重复您在另一个 catch 块中所做的事情(在这种特定情况下还不错)。

于 2012-11-10T02:32:01.680 回答