我喜歡qwned的方法與#send,但它不是所有的方法順序調用的情況下的理想。
延續都非常適合於這樣的事情:
require 'continuation'
class Continuer
# Define five methods for testing
(1..5).each { |i| define_method("method#{i}") { puts "method#{i} called" } }
def do_these_things
cc = nil
callcc { |c| cc = c; method1; }
callcc { |c| cc = c; method2; raise }
# Do other things right here, maybe...
callcc { |c| cc = c; method3; raise }
callcc { |c| cc = c; method4; }
callcc { |c| cc = c; method5; }
rescue
puts 'Caught exception. Continuing.'
cc.call
end
end
Continuer.new.do_these_things
此效果是通過執行每個容易出現故障的方法時在「抄送」可變記錄的延續。救援聲明然後簡單地繼續下去。這有點像帶有動態標籤的goto語句。
的發言都拋出同樣的異常,我希望他們都執行。所以不幸的是,這不是一個有效的答案:( – chiborg
好的,但這取決於你的需要。你想要以不同的方式處理每個故障?爲什麼不把它們放在一個單一的救援塊?我猜你想知道「在那裏「拋出異常,所以你應該嘗試在每個函數(或內部)後改變一些」狀態「,然後在救援塊中查詢該狀態。 – mcortesi