这是我当前的异常处理代码。
特别注意标有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上。
答案 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块中做的事情(在这个特定情况下也不错)。