Ruby 错误捕获
给定一个类:Ruby 错误捕获,ruby,Ruby,给定一个类: class Foo def initialize(input1) @input1 = input1 end end 是否有某种方法可以对a=Foo.new()抛出更有用的错误?如何构建一个方法,以更有用的方式抛出ArgumentError 我想把这个融入课堂。列出了几种错误捕获机制,但所有这些机制似乎都依赖于在catch块中包装a=Foo.new()。但是,我希望将我的错误捕获到类本身。在未定义参数时,只需提出错误即可。通过将消息指定为异常的参数,可以将
class Foo
def initialize(input1)
@input1 = input1
end
end
是否有某种方法可以对a=Foo.new()
抛出更有用的错误?如何构建一个方法,以更有用的方式抛出ArgumentError
我想把这个融入课堂。列出了几种错误捕获机制,但所有这些机制似乎都依赖于在
catch
块中包装a=Foo.new()。但是,我希望将我的错误捕获到类本身。在未定义参数时,只需提出错误即可。通过将消息指定为异常的参数,可以将消息添加到ArgumentError
异常:
class Foo
def initialize(input1=nil)
raise ArgumentError, "expected a value for Foo.new('value')" unless input1
@input1 = input1
end
end
在未定义参数时,只需提出错误,就可以做到这一点。通过将消息指定为异常的参数,可以将消息添加到ArgumentError
异常:
class Foo
def initialize(input1=nil)
raise ArgumentError, "expected a value for Foo.new('value')" unless input1
@input1 = input1
end
end
例如,您可以使用默认值并在initialize方法中引发所需的任何错误
Class A
def initialize(a = nil)
raise("give me an A") if a.nil?
@a = a
end
end
例如,您可以使用默认值并在initialize方法中引发所需的任何错误
Class A
def initialize(a = nil)
raise("give me an A") if a.nil?
@a = a
end
end
在阅读了更多的内容后,我认为将其用作钩子可能会起到以下作用:
alias_method :initialize_orig, :initialize
def initialize(*args)
begin
result = initialize_orig(*args)
return result
rescue Exception
$stderr.print "Need to use argument 'input1'\n"
raise
end
end
在阅读了更多的内容后,我认为将其用作钩子可能会起到以下作用:
alias_method :initialize_orig, :initialize
def initialize(*args)
begin
result = initialize_orig(*args)
return result
rescue Exception
$stderr.print "Need to use argument 'input1'\n"
raise
end
end
因为您是Ruby新手,所以可以理解这个错误可能看起来很奇怪,但它也是一个非常特定于传入错误参数的错误。将其重新映射到其他对象并不一定有用,它最终会在代码中隐藏问题。我建议保持原样,如果你没有正确地调用它,那么就应该期待这样的错误发生
另一种方法是,至少在较新版本的Ruby中,声明没有默认值的关键字参数:
def initialize(input1:)
end
这是一个必需的关键字参数,错误更具体:
ArgumentError:缺少关键字:input1
缺点是你不得不这样称呼它:
Foo.new(input1: 'test')
这在清晰性方面可能是有益的。这取决于您。因为您是Ruby新手,所以可以理解这个错误可能看起来很奇怪,但它也是一个非常特定于传入错误参数的错误。将其重新映射到其他对象并不一定有用,它最终会在代码中隐藏问题。我建议保持原样,如果你没有正确地调用它,那么就应该期待这样的错误发生
另一种方法是,至少在较新版本的Ruby中,声明没有默认值的关键字参数:
def initialize(input1:)
end
这是一个必需的关键字参数,错误更具体:
ArgumentError:缺少关键字:input1
缺点是你不得不这样称呼它:
Foo.new(input1: 'test')
这在清晰性方面可能是有益的。这取决于您。在初始化中的ArgumentError之前引发的默认ArgumentError不是吗?很好。将参数默认为nil,然后在初始化块内引发参数错误。我更新了答案。默认ArgumentError不是在initialize中ArgumentError之前引发的吗?很好。将参数默认为nil,然后在初始化块内引发参数错误。我更新了答案,“更有用的错误”是什么?你的问题很模糊,“更有用的错误”是什么?你的问题很模糊。