对于我正在处理的应用程序,我的一个团队成员一直在研究一个通用错误处理程序,当我们的某个系统进入一个相对较高级别的异常状态时,它会向我们的团队执行一些报告。
然而,几个星期前,我在低级别(特别是数据库访问)编写了一些提供一些通知的代码。随着这个团队成员的高级代码的出现,团队的其他成员认为我们可以安全地删除我的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;
}
这导致我的问题:抛出异常并在更高级别处理后,会发生什么?我的代码是否会回到它停止的位置,或者执行是否在其他地方恢复?当出现问题并在不同的级别进行清理时,代码会在哪里继续进行?
答案 0 :(得分:1)
抛出异常会强制stack unwinding
,这意味着当前执行堆栈将被放弃,最终结束时会出现catch()
。
这意味着,如果你在调用方法中捕获exception
,你将最终进入ist catch()
- 处理程序,并且你将不会返回到被调用者中发生异常的位置。所以,如果你有一个return语句,这将永远不会达到!
Here是一篇很好的短文。
答案 1 :(得分:1)
如果您在此处抛出异常,则永远不会返回您在FooResult
内创建的Foo()
对象。
异常会破坏代码的正常控制流并使其冒泡,直到某人抓到异常或程序完全停止为止。
较高级别可能会捕获异常并重试,但这不在您方法的手中。