我在这里有一个非常基本的应用程序,我试图通过将类声明为该错误来更明显地制作错误和异常。相关课程为InvalidUserId
,取代Sequel::DatabaseError
在主应用程序逻辑中,我尝试使用id
通过self[:address]
从数据库中获取用户。由于这是一种验证方法,因此输入不一定是id
,而是电子邮件地址,这会导致模型失败并显示Sequel::DatabaseError
。
这很好,花花公子,但我的救援声明似乎并没有意识到InvalidUserId
指向Sequel::DatabaseError
,这意味着,当错误发生时,代码不会进入{ {1}}阻止。但是,如果我用rescue
替换救援中的InvalidUserId
,它会进入救援区。
Sequel::DatabaseError
我不确定为什么应用程序无法识别我的自定义错误,即使抛出的错误是我声明的错误。
编辑:看来这种制作自定义异常的方法只允许你加注,而不是捕获,是吗?答案 0 :(得分:1)
数据库查询正在引发异常。要将其添加到自定义类中,您需要解除正常异常,然后提高自定义异常,以便再次获救。在Ruby中,这需要另一层嵌套(你不能在一个块中进行救援/提升/救援)。
begin
begin
user = App::Model::User.where(id: self[:address]).first
rescue Sequel::DatabaseError => exception
raise InvalidUserId, exception.message
end
rescue InvalidUserId
# ...
end
除非你真的让异常消失,否则对我来说似乎不值得。立刻救出它有点失败了......