这是我当前的异常处理代码。
特别注意标有***
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
异常和不FaultException
异常)留给最终catch
。不幸的是,这无法正常工作。
我在 .NET 4 上。
你不完全理解try/catch语法。您可以将多个渔获附加到一次尝试 - 最匹配的渔获是将被选择的渔获。在这种情况下,FaultException的catch将触发,然后永远不会调用更一般的Exception,因为异常已经处理过。
你需要做的是将整个try/catch包装在另一个try/catch中,专门用于更一般的异常情况,如果你总是想处理它;要么这样做,要么重新设计你的逻辑。(例如,您可以将其简化为异常捕获,然后检查它是否是 FaultException。
每个try
块只执行一个catch
块。
我会将catch
块重写为:
catch (Exception e)
{
if (e is FaultException && Regex.IsMatch(e.Message, "something"))
{
....
}
else // all other exceptions
{
....
}
}
throw e
永远不会被同一级别的异常捕获caught
。
catch
内部的throw
将始终抛出给方法的调用者。
此外,建议如果您想重新抛出,请throw
而不是throw e
。 第一种情况保留调用堆栈。
如果在 catch块中抛出异常,则不会在同一 try-catch 中捕获该异常。
您可以在 else 条件下重复您在另一个捕获块中正在执行的操作(在这种特定情况下还不错)。