【问题标题】:"Handle it higher up" definition“处理得更高”的定义
【发布时间】:2009-12-05 02:22:39
【问题描述】:

在堆栈跟踪中,顶部的方法调用是最近调用的方法。

当提到短语“handle it Higher up”时,这是指在方法调用者中还是在 catch 块中调用另一个方法?

此外,在我编写的带有 API 的多层应用程序中,似乎最好的策略是始终记录异常并尽快处理并重新抛出,以便 UI 中的调用方法可以显示错误.异常重抛还有其他使用场景吗?

如果文件被锁定,是否应该在 catch 块中默认执行诸如重试操作或加载另一个文件之类的操作?异常处理是关于报告错误还是关于再次尝试操作/使用不同参数再次尝试?

谢谢

【问题讨论】:

  • 当我看到人们重新尝试操作时,我总是畏缩不前。他们几乎总是失败。
  • 这往往会导致阻塞有效请求的失败循环。

标签: exception-handling


【解决方案1】:
  1. 较高的意思是在堆栈中较低,是的。

  2. 如果您要改变重试的方式——即,您知道将起作用的策略或 ONE 将起作用的策略集合,那么也许您可以立即执行;但是,来自函数或布尔的错误代码可能更好;这是因为我们实际上不是在谈论异常行为。

  3. 异常处理不是循环机制,不是。在异常中一次又一次地重试是邪恶的。

  4. 通常您应该记录异常,但这不是异常的主要目的。 异常是它们作为从异常行为中恢复的标准机制,以一种有据可查的方式(在代码中)。他们替换了 C 和 C++ 中的 goto 和 longjmp 语句。如果出现问题,您将绝对跳转到代码中的某个标签。

  5. 记录异常并重新抛出是好的,这是公认的惯例。


示例和讨论

在您的锁定示例中,您可能应该阻止等待锁定释放。如果锁没有被释放,可能是一个自旋锁(或等待一个短暂但定义的间隔),一个异常会被抛出——现在在这种情况下,这将是一个异常,因为你编写了锁定文件的代码,并且你有编写代码以尽快释放锁。

这里有一个问题,您可能希望在处理完您的异常后再等一会儿,我打赌您想假装该异常从未发生过——即,从您离开的地方重新开始。但是异常机制不能带你回到原来阻塞发生的地方。您的解决方案是:

  1. 您可以通过再次尝试(而不是一次又一次地 :P)从异常开始新的代码回归(如上所述)。但这是您代码的新回归,这是不对的。

  2. 您可以跳转到最初等待的位置。然而,标签和跳转会让你成为大多数编程团队中的贱民。我对他们并不感到不安,但那就是我。

  3. 您可以使用错误代码和防御性编程。这是最干净的方法。您的尝试只会体现您打算运行的代码,以及您的异常,即您真正没想到的异常行为。

代码:1

try{...}
catch{alternateStrategy()}

代码:2

try
{
   IAmALabel:
   checkFileLock(timeoutVal);
}
Catch
{
   timeoutVal = timeoutVal*2;
   goto IamALabel;
}

注意:以上可能是一个无限循环,如果你使用它,请设置一个上限。

代码 3:

int tries=3;
while(true)
{
   int ret=CheckFileLock(timeoutVal);
   if(ret==0) // 0 = success, anything else represents a distinct error.
      break;
   tries--;

   if(tries==0)
      throw exception();
}

【讨论】:

  • 3) 将是最好的方法。有2的代码示例吗?听起来就像 1)。从功能的角度来看,除了记录/清理之外,异常不应该做任何事情。它可以重试操作,但成功程度不同。我听说过“处理”异常这个词,我似乎认为这意味着采取实际行动,而不仅仅是记录。但我想这就是防御性编码发挥作用的地方。
  • 你去吧 :P 希望没有人来对我发火 2 :D 希望这能澄清事情。
猜你喜欢
  • 1970-01-01
  • 2013-04-22
  • 1970-01-01
  • 2020-01-11
  • 1970-01-01
  • 1970-01-01
  • 2014-12-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多