提问人:aj soprano 提问时间:8/1/2022 更新时间:8/2/2022 访问量:411
如何向自定义 Rails 异常添加属性
how to add attributes to custom rails exceptions
问:
假设我有一个从父错误类继承的自定义错误类。我怎样才能将属性添加到该类中,例如:
class CustomError <CustomParentErrorClass
status: 500
end
这样我就可以在我的控制器中做类似的事情
rescue CustomErroClass => e
head(e.status)
我基本上想从我的控制器的 rails 错误类访问我的属性,但不确定如何操作。有什么想法吗?
答:
1赞
Ankit
8/2/2022
#1
您可以像定义任何其他错误类一样定义类的属性CustomError
class CustomError < StandardError
attr_reader :status
def initialize(status)
@status = status
end
end
下面是一个示例用法
begin
raise CustomError.new(500)
rescue CustomError => e
head(e.status)
end
如果属性是硬编码的,并且不需要从引发错误的位置传递,则可以对其进行硬编码
class CustomError < StandardError
attr_reader :status
def initialize
@status = 500 # you can also define a constant instead of attribute if the value will be a constant
end
end
也就是说,对于您分享的示例,请注意:
您正在定义一个属性。我猜这个错误会从您的模型或服务类中引发,并在控制器中获救。如果是这种情况,请考虑避免将模型类耦合到控制器应返回的 HTTP 状态。status
评论
0赞
aj soprano
8/2/2022
我看到这似乎有效;不过有一个问题;你为什么要把状态设为实例变量?为什么不只是而不是?status
@status
0赞
Ankit
8/2/2022
我不确定你的意思。你是在问永远(并且在提出时没有通过)的情况吗?在这种情况下,是的,您不需要实例变量。你可以这样做,返回status
500
def status
500
0赞
aj soprano
8/2/2022
状态未硬编码的实例;那为什么我们需要实例变量呢?
0赞
Ankit
8/2/2022
明白了。因此,如果您不创建实例变量,而只使用 ,那么该变量将在我们退出方法后立即被销毁,但我们希望即使在退出方法后也可用;创建一个实例变量允许它存在,即使在我们存在 initialize 方法之后也是如此。这有意义吗?status = ...
status
initialize
status
initialize
1赞
Ankit
8/2/2022
另外,如果答案解决了您的问题,您能否接受并投票。
评论