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

时间:2013-04-03 19:51:40

标签: c# exception-handling

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

然而,几个星期前,我在低级别(特别是数据库访问)编写了一些提供一些通知的代码。随着这个团队成员的高级代码的出现,团队的其他成员认为我们可以安全地删除我的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;
}

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

2 个答案:

答案 0 :(得分:1)

抛出异常会强制stack unwinding,这意味着当前执行堆栈将被放弃,最终结束时会出现catch()。 这意味着,如果你在调用方法中捕获exception,你将最终进入ist catch() - 处理程序,并且你将不会返回到被调用者中发生异常的位置。所以,如果你有一个return语句,这将永远不会达到!

Here是一篇很好的短文。

答案 1 :(得分:1)

如果您在此处抛出异常,则永远不会返回您在FooResult内创建的Foo()对象。

异常会破坏代码的正常控制流并使其冒泡,直到某人抓到异常或程序完全停止为止。

较高级别可能会捕获异常并重试,但这不在您方法的手中。