此异常处理代码需要修复

时间:2012-11-10 02:23:28

标签: c# .net

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

特别注意标有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; // <-- ***,则不会被最终的catch抓住。相反,应用程序只是崩溃,好像没有处理异常。

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

您在第一个catch中看到我只对实际处理满足特定条件的FaultException个异常感兴趣,但保留所有其他异常(FaultException个例外不< / strong>满足最终FaultException的条件catch的例外情况。不幸的是,这不能正常工作。

我在.NET 4上。

4 个答案:

答案 0 :(得分:5)

您并不完全了解try / catch语法。您可以将多个捕获附加到单个尝试 - 最匹配的捕获是将要选择的捕获。在这种情况下,将触发FaultException的catch,然后永远不会调用更一般的Exception,因为已经处理了异常。

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

答案 1 :(得分:2)

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

我会将catch块重写为:

catch (Exception e)
{
    if (e is FaultException && Regex.IsMatch(e.Message, "something"))
    {
        ....
    }
    else // all other exceptions
    {
        ....
    }
}

答案 2 :(得分:1)

throw e永远不会是同一级别的异常捕获caught

throw内的catch始终会抛出方法的调用者。

另外,建议如果你想重新投掷throw而不是throw e。第一种情况保留了调用堆栈。

答案 3 :(得分:0)

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

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