Как я могу легко и программно определить, возник ли из-за немедленного отказа вызывающего абонента предоставить необходимый блок методу или глубже в этом методе и других, которые он вызывает?Как определить происхождение 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 Мне не пришло в голову проверить, действительно ли был поставлен блок. (Тем не менее, мне все равно не нравятся разборки backtrace * per se *.) – pilcrow
@ sepp2k, я думаю, что нашел лучшую ставку ... опубликует через мгновение. – pilcrow
@ sepp2k, я думаю, что побеждаю за строгую точность, но вы выигрываете для простоты, что является лучшим критерием здесь. :) – pilcrow