在更高级别成功捕获异常后执行的后续命令
本文关键字:执行 命令 捕获异常 高级别 成功 | 更新日期: 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
对象如果抛出异常将永远不会返回。
异常打破了代码的正常控制流,直到有人捕捉到异常或程序完全停止。
上层可能会捕获异常并重试,但这超出了您的方法的范围。