在更高级别成功捕获异常后执行的后续命令

本文关键字:执行 命令 捕获异常 高级别 成功 | 更新日期: 2023-09-27 18:07:21

对于我正在开发的一个应用程序,我的一个队友一直在研究一个通用的错误处理程序,当我们的一个系统在一个相对较高的级别上进入异常状态时,它会向我们的团队执行一些报告。

然而,几周前,我写了一些底层代码(特别是数据库访问),它提供了一些通知。随着这个团队成员的高级代码的出现,团队的其他成员认为我们可以安全地删除我的try/catch系统。

一个注意事项:在这个特定存储库方法返回的数据结构上有一个IsSuccessful标志。当发生异常时,此标志保持为false(在成功获取数据时,该标志设置为true)

因此,暂时,我的代码看起来像这样:
public FooResult Foo()
{
  FooResult result = new FooResult { IsSuccessful = false };
  SqlParameter[] args = new []
  {
    // Some args, immaterial to the situation.
  }
  try
  {
    DataSet ds = SqlHelper.ExecuteDataset(_connection, CommandType.Text, query, args);
    result = new FooResult
             {
               IsSuccessful = true,
               // ...Other fields are set...
             };
  }
  catch
  {
    result.IsSuccessful = false;
    throw;   // Per request
  }
  return result;
}

这导致了我的问题:在抛出异常并在更高级别处理时,之后会发生什么?我的代码是回到它离开的地方,还是在其他地方继续执行?当出现问题并在不同级别进行清理时,代码将继续运行到哪里?

在更高级别成功捕获异常后执行的后续命令

抛出异常强制stack unwinding,这意味着当前执行堆栈将被放弃,最终您将结束,那里有一个catch()
这意味着,如果您在调用方法中捕获了exception,那么您将在第一个catch()处理程序中结束,并且您将不会返回到被调用方中发生异常的位置。因此,如果您有一个返回语句,这将永远不会达到!

这里有一篇很好的短文。

Foo()内部创建的FooResult对象如果抛出异常将永远不会返回。

异常打破了代码的正常控制流,直到有人捕捉到异常或程序完全停止。

上层可能会捕获异常并重试,但这超出了您的方法的范围。