Ruby 使用自定义消息创建自定义运行时错误的最短方法?

Ruby 使用自定义消息创建自定义运行时错误的最短方法?,ruby,Ruby,是否有一个较短的方法来实现以下目标 class InvalidEmail < RuntimeError def initialize(email) @email = email; end def to_s; "'#{@email}' is an invalid email"; end end 这可能会节省一些换行。不过,我会保持线路中断 InvalidEmail = Class.new(RuntimeError) { attr_accessor :

是否有一个较短的方法来实现以下目标

 class InvalidEmail < RuntimeError
    def initialize(email) @email = email; end
    def to_s; "'#{@email}' is an invalid email"; end
 end

这可能会节省一些换行。不过,我会保持线路中断

InvalidEmail = Class.new(RuntimeError) { attr_accessor :email; def to_s; "'#{@email}' is an invalid email"; end }

这可能会节省一些换行。不过,我会保持线路中断

InvalidEmail = Class.new(RuntimeError) { attr_accessor :email; def to_s; "'#{@email}' is an invalid email"; end }


raise
无异常类本身就是一个
运行时错误
。所以你可以只做
raise“#{email}是一封无效的电子邮件”
。不过我想要自定义错误类。所以问题是重写我的示例,同时保留自定义类和自定义消息,但使用更少的样板文件,为什么您希望它比那个更短?这只会损害可读性。@user81269,问问自己:指定我的自定义错误需要什么信息?1.错误的类名(
InvalidEmail
)。2.字符串消息3。引用传入的参数的内容。这些信息可以轻松地放在一行上。其他一切都是陈词滥调和分心。如果您认为样板文件有助于可读性,那么您需要重新调整对可读性的整体理解。在创建异常类时,还应该关注层次结构。也许您想明确地从
InvalidEmail
中解救,但也许您想从
ValidationError
中解救,并且您想确保在一个位置捕获InvalidEmail、InvalidFirstName、InvalidAnything。因此,类层次结构对于异常也很重要。您选择忽略的内容实际上是为了帮助您。
raise
without-exception类本身就是一个
RuntimeError
。所以你可以只做
raise“#{email}是一封无效的电子邮件”
。不过我想要自定义错误类。所以问题是重写我的示例,同时保留自定义类和自定义消息,但使用更少的样板文件,为什么您希望它比那个更短?这只会损害可读性。@user81269,问问自己:指定我的自定义错误需要什么信息?1.错误的类名(
InvalidEmail
)。2.字符串消息3。引用传入的参数的内容。这些信息可以轻松地放在一行上。其他一切都是陈词滥调和分心。如果您认为样板文件有助于可读性,那么您需要重新调整对可读性的整体理解。在创建异常类时,还应该关注层次结构。也许您想明确地从
InvalidEmail
中解救,但也许您想从
ValidationError
中解救,并且您想确保在一个位置捕获InvalidEmail、InvalidFirstName、InvalidAnything。因此,类层次结构对于异常也很重要。你选择忽略的,实际上是在帮助你。这总是会导致,
''是无效的电子邮件
,无论你以
电子邮件的形式传递什么。啊,忘了提到用法有点不同。你需要在构造函数之外设置
exception.email=@email
。我对此不感兴趣。构造它应该是一个简单的步骤,并且对象应该是不可变的。然后用
def initialize(email);…;替换
attr_访问器
;结束。与初始实现基本相同。
to_s
@email=email
可以泛化并提取到基类,在这种情况下,该类将成为
InvalidEmail=class.new(SimpleError){def initialize(object,message);super;end}
。不过只要上一节课就不用麻烦了。因此,即使是
初始化
也不需要在那里。这总是会导致
''是无效的电子邮件
,无论您以
电子邮件的形式传递什么。啊,忘了提到用法有点不同。你需要在构造函数之外设置
exception.email=@email
。我对此不感兴趣。构造它应该是一个简单的步骤,并且对象应该是不可变的。然后用
def initialize(email);…;替换
attr_访问器
;结束。与初始实现基本相同。
to_s
@email=email
可以泛化并提取到基类,在这种情况下,该类将成为
InvalidEmail=class.new(SimpleError){def initialize(object,message);super;end}
。不过只要上一节课就不用麻烦了。就这点而言,即使是
initialize
也不需要在那里。