【问题标题】:Ruby - Error Handling - Good PracticesRuby - 错误处理 - 良好实践
【发布时间】:2012-01-15 09:44:38
【问题描述】:

这更像是一个以意见为导向的问题。在嵌套代码中处理异常时,例如:

  • 假设您有一个类初始化另一个类来运行作业。该作业返回一个值,然后由最初调用它的类处理。

您会将异常和错误记录放在哪里?您会在调用类中的作业类的初始化中定义它,然后在作业执行中或在两个级别上处理异常?

【问题讨论】:

    标签: ruby exception logging


    【解决方案1】:

    如果作业处理异常,则无需将作业调用包装在 try catch 中。

    但初始化和运行作业的类可能会抛出异常,因此您也应该在该级别处理异常。

    这是一个例子:

    def some_job
       begin
         # a bunch of logic
       rescue
         # handle exception
         # log it 
       end
    end
    

    这样做是没有意义的:

    def some_manager
      begin
        some_job
      rescue
        # log 
      end
    end
    

    但这样的事情更有意义:

    def some_manager
      begin
        # a bunch of logic
        some_job
        # some more logic
      rescue
        # handle exception
        # log 
      end
    end
    

    当然你会想要捕获特定的异常。

    【讨论】:

    • 当您拯救整个方法时,beginend 是不必要的。您可以删除它们,它仍然可以。
    【解决方案2】:

    一般来说,在 Ruby 中处理异常的最佳答案可能是阅读 Exceptional Ruby。它可能会改变您对错误处理的看法。

    话虽如此,您的具体情况。当我在听到“后台进程”中听到“工作”时,我将以此为基础回答。

    您的工作需要在执行任务时报告状态。这可能是“队列中”、“正在运行”、“已完成”等状态,但也可能是提供更多信息(面向用户)的信息:“处理 1000 条记录中的前 100 条记录”。

    所以,如果您的后台进程发生错误,我的建议有两个:

    1. 确保在退出作业之前捕获异常。您的后台作业处理器可能不喜欢来自您的代码的随机异常。我个人喜欢捕获异常并将其保存到数据库中以便以后检索的想法。再说一次,根据您的后台作业处理器,它可能会为您处理错误报告。 (例如,我认为 reque 确实如此)。

    2. 在前端,使用 AJAX(或其他)偶尔检查工作的执行情况。每隔 10 秒或其他时间说一次。除了获取作业状态之外,还请确保将此附加信息返回给用户(如果适用)。

    【讨论】:

      猜你喜欢
      • 2010-09-14
      • 1970-01-01
      • 1970-01-01
      • 2018-10-10
      • 1970-01-01
      • 2012-01-10
      • 1970-01-01
      • 1970-01-01
      • 2011-07-29
      相关资源
      最近更新 更多