此异常处理代码需要修复

  • 本文关键字:异常处理 代码 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异常和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 条件下重复您在另一个捕获块中正在执行的操作(在这种特定情况下还不错)。

相关内容

  • 没有找到相关文章