关于ruby:引发异常:string vs custom class

Raising an an exception: string vs custom class

有什么好处要做:

1
2
3
ApiTokenExpired = Class.new(StandardError)
...
raise ApiTokenExpired if response.errorCode == 429

在这个更懒惰的替代方案:

1
raise 'api token expired' if response.errorCode == 429

考虑到这个错误检测只在代码中发生一次?


如果您必须以特定方式在调用堆栈中的某个位置处理错误,那么自定义错误(如ApiTokenExpired)有一个重要的优点。

1
2
3
4
5
6
7
begin
  # ...
rescue ApiTokenExpired => error
  # handle the specific error
rescue => error
  # default error handling
end

IMO决定创建自定义错误并不取决于项目的规模或未来的维护。

由于自定义错误类会导致额外的工作,因此我默认不使用它。当需要特殊的错误处理时,应该引入错误类。


如果您的应用程序被设计为具有错误处理或计划在未来(我的意思是,任何成功的系统将需要那一天,对吧?),您可以对字符串执行的唯一操作是在日志中读取或将它显示在错误消息中,使用类型可以以分离的方式对各种事物进行编码。

例如,ApiTokenExpired可以通过"再试一次"响应来处理,因为它是一个外部问题,或者由更新API令牌所需的步骤处理(如果你使用了Typed Exception,你可以在以后插入它!),也许您希望所有被视为严重或意外错误的错误向系统管理员发送电子邮件并存储错误频率的统计信息,键入的例外允许您根据系统时的操作编码任何您想要的内容行为不端。


使用第一个,当代码嵌入较大的软件时,您可以选择性地挽救该类的错误。您仍然可以使用与错误消息字符串匹配的模式匹配第二个,但通常,您可能会因重构而改变消息格式(与使用第一个表单更改异常类的可能性相反),以及也可以有不同的异常,它们具有相似的消息字符串,这两种异常都可以破坏模式匹配。当您考虑将来的维护时,第一个更好。