如何在Ruby中跳出begin块?

5

我该如何跳出begin块并进入rescue块?

def function
  begin
    @document = Document.find_by(:token => params[:id])
    next if @document.sent_at < 3.days.ago # how can I skip to the rescue block here?
    @document.mark_as_viewed
  rescue
    flash[:error] = "Document has expired."
    redirect_to root_path
  end
end

我尝试使用next,但没有成功。


4
我认为你没有正确使用 rescue 关键词... - nzifnab
3
如果你经常这样做的话,可以尝试使用 def...rescue...end 而不是 def...begin...rescue...end...end - kddeisz
@kddeisz的评论非常有帮助。 - Kaka Ruto
1个回答

8

好的,您可以引发一个错误。这就是begin/rescue代码块的工作原理。不过,这并不是一个好主意 - 通常不鼓励使用错误处理来处理业务逻辑。

似乎将其重构为简单条件语句更有意义。类似于:

def function
  @document = Invoice.find_by(:token => params[:id])
  if @document.sent_at < 3.days.ago
    flash[:error] = "Document has expired."
    redirect_to root_path
  else
    @document.mark_as_viewed 
  end
end

您似乎混淆了几种与块相关的关键字:

错误处理(begin/rescue/end)用于在您认为尝试执行某些操作时可能引发错误的情况下,并以特定方式对其进行响应。

next用于迭代-当您循环遍历集合并希望跳到下一个元素时使用。

条件语句(if, unless, else等)通常用于检查某个状态并根据其执行不同的代码片段。


我本来想写一个完全符合这个要求的答案,但我决定给你点赞。如果没有发生任何异常情况,不要在简单的业务逻辑中使用“rescue”,这是正确的做法。 - nzifnab
谢谢,但是这种方式可能会导致@document出现空值错误,不是吗?这就是我使用begin/rescue块的原因。 - Tintin81
@Tintin81 API 表示 .find_by 等同于 .where,因此如果没有匹配的记录,它应该简单地将 @document 设置为 nil,然后您可以检查以便正确响应(可能使用状态 404?这取决于您的逻辑)。 - MrTheWalrus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接