如何輕鬆地並以編程方式確定LocalJumpError
是由調用者立即失敗而產生的,該方法是否爲方法提供了所需的塊,或者來自該方法的更深層和調用的其他方法的深層?如何確定LocalJumpError的來源?
「容易」,我的意思是我想避免字符串檢查/ regexen在$!.backtrace
。適用於1.8和1.9的解決方案也是優選的。
動機:當我把事情弄糟在紅寶石的方法調用,通常是因爲我輸入了錯誤的方法(NoMethodError
),得到的參數錯誤(ArgumentError
)或忽視傳遞一個必要的塊(LocalJumpError
)的數量。
對於紅寶石代理或裝飾包裝對象,我想從實施者或環境錯誤可以提高錯誤的同一類別區分這些主叫或API錯誤。例如:
...
def method_missing(sym, *args, &block)
@wrapped.__send__(sym, *args, &block)
rescue NoMethodError
raise MyApp::BadInvocation, "duh - no such method" unless @wrapped.respond_to?(sym)
raise
rescue ArgumentError
raise MyApp::BadInvocation, "duh - wrong arg count" \
unless _args_fit_arity?(@wrapped.method(sym), args)
raise
rescue LocalJumpError
# XXX - what is the test?
raise
end
+1我沒有想過檢查塊是否實際提供。 (不過,不喜歡解析回溯*本身*) – pilcrow 2009-09-18 14:33:17
@ sepp2k,我想我發現了一個更好的選擇......稍後會發布。 – pilcrow 2009-09-19 02:40:35
@ sepp2k,我認爲我贏得了嚴格的準確性,但是爲了簡單起見,這是一個更好的標準。 :) – pilcrow 2009-09-24 13:53:00