【发布时间】:2012-01-15 09:44:38
【问题描述】:
这更像是一个以意见为导向的问题。在嵌套代码中处理异常时,例如:
- 假设您有一个类初始化另一个类来运行作业。该作业返回一个值,然后由最初调用它的类处理。
您会将异常和错误记录放在哪里?您会在调用类中的作业类的初始化中定义它,然后在作业执行中或在两个级别上处理异常?
【问题讨论】:
这更像是一个以意见为导向的问题。在嵌套代码中处理异常时,例如:
您会将异常和错误记录放在哪里?您会在调用类中的作业类的初始化中定义它,然后在作业执行中或在两个级别上处理异常?
【问题讨论】:
如果作业处理异常,则无需将作业调用包装在 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
当然你会想要捕获特定的异常。
【讨论】:
begin 和 end 是不必要的。您可以删除它们,它仍然可以。
一般来说,在 Ruby 中处理异常的最佳答案可能是阅读 Exceptional Ruby。它可能会改变您对错误处理的看法。
话虽如此,您的具体情况。当我在听到“后台进程”中听到“工作”时,我将以此为基础回答。
您的工作需要在执行任务时报告状态。这可能是“队列中”、“正在运行”、“已完成”等状态,但也可能是提供更多信息(面向用户)的信息:“处理 1000 条记录中的前 100 条记录”。
所以,如果您的后台进程发生错误,我的建议有两个:
确保在退出作业之前捕获异常。您的后台作业处理器可能不喜欢来自您的代码的随机异常。我个人喜欢捕获异常并将其保存到数据库中以便以后检索的想法。再说一次,根据您的后台作业处理器,它可能会为您处理错误报告。 (例如,我认为 reque 确实如此)。
在前端,使用 AJAX(或其他)偶尔检查工作的执行情况。每隔 10 秒或其他时间说一次。除了获取作业状态之外,还请确保将此附加信息返回给用户(如果适用)。
【讨论】: