Exception handling &引用;把它放高一点。”;定义

Exception handling &引用;把它放高一点。”;定义,exception-handling,Exception Handling,在堆栈跟踪中,顶部的方法调用是最近调用的方法 当提到短语“handleit higher up”时,这是指在方法调用程序中还是在catch块中调用另一个方法 此外,在使用我编写的API的多层应用程序中,似乎最好的策略是始终记录异常并尽快处理它,然后重试,以便UI中的调用方法可以显示错误。是否有其他异常重新触发的使用场景 如果某个文件被锁定,默认情况下是否应该在catch块中执行重试操作或加载另一个文件等操作?异常处理是关于报告错误还是关于重试操作/使用不同参数重试 谢谢 越高意味着堆栈越低,是的

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

当提到短语“handleit higher up”时,这是指在方法调用程序中还是在catch块中调用另一个方法

此外,在使用我编写的API的多层应用程序中,似乎最好的策略是始终记录异常并尽快处理它,然后重试,以便UI中的调用方法可以显示错误。是否有其他异常重新触发的使用场景

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

谢谢

  • 越高意味着堆栈越低,是的

  • 如果你打算改变你重试的方式,也就是说,一个你知道会起作用的策略或者一组你会起作用的策略,那么也许你可以在捕获中做到这一点;然而,来自函数或bool的错误代码可能更好;这是因为我们实际上不是在谈论异常行为

  • 异常处理不是一种循环机制,不。一次又一次的重试是异常内部的罪恶

  • 通常,您应该记录异常,但这不是异常的主要目的异常是一种标准的机制,可以从异常行为中以一种文档化(代码化)的方式恢复。它们取代了C和C++中的Goto和LangJMP语句。如果出现了错误,您将绝对跳转到代码中的某个标签

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


  • 示例和讨论

    在您的锁定示例中,您可能应该阻止等待锁释放。如果锁没有释放,可能会抛出一个异常(或者等待一个很短但定义好的时间间隔)——在本例中,这将是一个异常,因为您编写了锁定文件的代码,并且已经编写了尽快释放锁的代码

    这里有一个问题,您可能希望在处理完异常后再等待一段时间,我打赌您希望假装该异常从未发生过——即,从您离开的位置重新启动。但是异常机制不能将您带回原始阻塞发生的地方。您的解决方案是:

  • 您可以通过重试(而不是反复尝试:p)从异常(如上所述)开始新的代码回归。但这是代码的新回归,这是不对的

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

  • 您可以使用错误代码和防御性编程。这是最干净的方式。您的尝试将只体现您打算运行的代码,以及您的异常,您真正不期望的异常行为

  • 代码: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();
    }
    
  • 越高意味着堆栈越低,是的

  • 如果你打算改变你重试的方式,也就是说,一个你知道会起作用的策略或者一组你会起作用的策略,那么也许你可以在捕获中做到这一点;然而,来自函数或bool的错误代码可能更好;这是因为我们实际上不是在谈论异常行为

  • 异常处理不是一种循环机制,不。一次又一次的重试是异常内部的罪恶

  • 通常,您应该记录异常,但这不是异常的主要目的异常是一种标准的机制,可以从异常行为中以一种文档化(代码化)的方式恢复。它们取代了C和C++中的Goto和LangJMP语句。如果出现了错误,您将绝对跳转到代码中的某个标签

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


  • 示例和讨论

    在您的锁定示例中,您可能应该阻止等待锁释放。如果锁没有释放,可能会抛出一个异常(或者等待一个很短但定义好的时间间隔)——在本例中,这将是一个异常,因为您编写了锁定文件的代码,并且已经编写了尽快释放锁的代码

    这里有一个问题,您可能希望在处理完异常后再等待一段时间,我打赌您希望假装该异常从未发生过——即,从您离开的位置重新启动。但是异常机制不能将您带回原始阻塞发生的地方。您的解决方案是:

  • 您可以通过重试(而不是反复尝试:p)从异常(如上所述)开始新的代码回归。但这是代码的新回归,这是不对的

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

  • 您可以使用错误代码和防御性编程。这是最干净的方式。您的尝试将只体现您打算运行的代码,以及您的异常,您真正不期望的异常行为

  • 代码:1

    try{...}
    catch{alternateStrategy()}
    
    代码:2

    try
    {
       IAmALabel:
       checkFileLock(timeoutVal);
    }
    Catch
    {
       timeoutVal = timeoutVal*2;
       goto IamALabel;
    }
    
    注意:以上可能是一个无限循环,如果您使用它,请对其设置一个上限