我想实现基于状态代码的错误。我试图实现此代码:
def parse_response
system_errors = { }
(100..199).each do |current|
system_errors[current.to_s] = SystemError
end
(200..999).each do |current|
system_errors[current.to_s] = CommunicationError
end
return params_for_success if successful_response?
# pp system_errors
pp payment_response
if valid?
raise system_errors[340].new(technical_message, response_code)
else
raise errors.full_messages.join(";n")
end
end
def successful_response?
response_code == RESPONSE_CODE_FOR_SUCCESS
end
def params_for_success
payment_response.dig(:payment_response)
end
.....
class CommunicationError < StandardError
def initialize(current_technical_message, response_code)
@response = response
end
end
但我会发现错误 parse_response': undefined method
for nil:nilclass(nomethoderror)`
根据数字范围提出错误的正确方法是什么?这一行引起了问题:system_errors[:error_class].new(technical_message, response_code)
与JavaScript不同,Ruby不会在类型之间隐式转换。
(200..999).each do |current|
system_errors[current.to_s] = CommunicationError
end
# now we have
system_errors["340"] == CommunicationError
所以稍后做
raise system_errors[340].new(technical_message, response_code)
它使用 Interger 键340
而不是 String 键"340"
。缺少键返回nil
,因此您正在调用nil.new
。确定您是要使用整数还是字符串键,并在插入/读取时坚持下去。