Как я могу легко и программно определить, возникла ли LocalJumpError
из-за немедленной неспособности вызывающей стороны предоставить необходимый блок методу или из глубины внутри этого метода и других, которые он вызывает?
Под словом "легко" я подразумеваю, что хотел бы избежать проверки / регулярного выражения строки на $!.backtrace
. Решение, применимое к 1,8 и 1,9, также является предпочтительным.
Мотивация: Когда я запускаю вызов метода в ruby, обычно это происходит из-за того, что я неправильно набрал (NoMethodError
) метод, неправильно набрал количество аргументов (ArgumentError
) или пренебрег необходимостью передать необходимый блок (LocalJumpError
).
Для прокси или декорирования объекта-оболочки в ruby я хотел бы отличить эти ошибки вызывающего или 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