我有一个嵌套在其他两个方法中的方法,并且我希望该方法能够从所有递归方法中break
返回错误。例如,如果我在这里叫pay_order
:
class API::StripeController < ApiController
def my_api_action
# ...
order = create_order
pay_order(order, token)
# do things if payment is successful
end
end
pay_order
的定义为:
def pay_order(order, token)
begin
order.pay(source: token)
rescue Stripe::CardError => e
break e
end
end
我该如何突破所有父方法并返回因付款失败而导致的卡错误?我需要类似break and return e
或return e and break
的东西。但是我知道break
和return
语句都会立即返回,因此我无法将它们链接起来(我不认为)。
我可以在要调用的每个函数中添加return
语句,但是我打算在很多地方使用此方法,并且不打算让它表现出不同的行为,因此我正在寻找最可重用的书写方式。
答案 0 :(得分:5)
为什么您在rescue
方法中pay_order
?我会在外循环上营救。
给出以下内容:
def method_a
10.times do |loop_a|
method_b
end
end
def method_b
5.times do |loop_b|
pay_order
end
end
def pay_order
...
end
例如,我要在method_a
内部营救:
def method_a
10.times do |loop_a|
method_b
end
rescue Stripe::CardError => e
# do whatever. no need to break
end
通过引发异常,所有循环都会自动“中断”。
如果您想在pay_order方法内做一些例外处理,那么我建议您再次营救并加薪:
def pay_order
order.pay
rescue Stripe::CardError => e
# do your stuff
raise e
end
答案 1 :(得分:1)