0

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

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

一个问题:IsSuccessful从这个特定的存储库方法返回的数据结构上有一个标志。发生异常时,该标志保持为假(成功获取数据时,该标志设置为真。)

因此,目前,我的代码如下所示:

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;
}

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

4

2 回答 2

1

抛出异常会强制 a stack unwinding,这意味着,当前的执行堆栈将被放弃,最终你会在有 a 的地方结束catch()
这意味着,如果您exception在调用方法中捕获 an,您将最终进入 ist catch()-handler,并且您将不会返回到被调用者中发生异常的位置。因此,如果您有退货声明,则永远无法实现!

是一篇很好的短文。

于 2013-04-03T19:55:05.593 回答
1

如果您在其中抛出异常,FooResult您在其中创建的对象将永远不会被返回。Foo()

异常会破坏代码的正常控制流并冒泡,直到有人捕捉到异常或程序完全停止。

更高级别可能会捕获异常并重试,但这不在您的方法的控制范围内。

于 2013-04-03T19:56:07.847 回答