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,然后在初始化块内引发参数错误。我更新了答案,“更有用的错误”是什么?你的问题很模糊,“更有用的错误”是什么?你的问题很模糊。