【发布时间】:2009-09-18 04:41:49
【问题描述】:
我如何以编程方式轻松地确定 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
【问题讨论】: