exception - Kotlin - 自定义异常作为数据类?
问题描述
在 Kotlin 中,创建自定义异常非常容易。下面是一个接受code
作为参数的示例:
class PortraitRequestFailedException(val code: Int) : RuntimeException()
code
包含从服务器返回的 http 响应错误代码。问题是,当记录器一般报告该异常时,例如Timber.e(exception, "Error loading portrait cover photo url")
,code
输出中会丢失:
2020-02-14 13:50:59.886 15942-16232 E/PortraitManager$watchCoverPhotoUrl: Error loading portrait cover photo url
com.example.data.PortraitManager$PortraitRequestFailedException
at com.example.data.PortraitManager$loadCoverPhotoUrl$1.call(PortraitManager.kt:139)
当然,我可以添加一个when exception is PortraitRequestFailedException
子句并专门处理该特定错误,但我不希望这样(尤其是 Kotlin 中的所有异常都未检查,我可能不知道期望什么类型)。
我找到了一种将代码RuntimeException
作为message
参数传递给 a 的简单方法:
class PortraitRequestFailedException(val code: Int) : RuntimeException(code.toString())
2020-02-14 13:40:32.878 430-857 E/PortraitManager$watchCoverPhotoUrl: Error loading portrait cover photo url
com.example.data.PortraitManager$PortraitRequestFailedException: 403
at com.example.data.PortraitManager$loadCoverPhotoUrl$1.call(PortraitManager.kt:139)
但是这种方法对我来说看起来有点过于冗长(我需要code
在父类构造函数中引用),它只会 print PortraitRequestFailedException: 403
,而不是告诉 403 指的是什么(想象这里有多个参数)。
所以我想出了将自定义异常定义为数据类的想法:
data class PortraitRequestFailedException(val code: Int) : RuntimeException()
由于 Kotlin 中的数据类有一个以 . 形式自动生成的toString()
方法PortraitRequestFailedException(code=403)
,因此这种表示法具有我想要的所有优点,而无需添加冗长或样板代码。日志如下:
E/PortraitManager$watchCoverPhotoUrl: Error loading portrait cover photo url
PortraitRequestFailedException(code=403)
at com.example.data.PortraitManager$loadCoverPhotoUrl$1.call(PortraitManager.kt:139)
您认为这种方法有什么缺点吗?将异常作为数据类处理有什么危险吗?
解决方案
我稍微倾向于手动覆盖toString()
自己,因为这是您唯一需要的data class
. 但总的来说,它确实有效,并且没有明显的缺点。
推荐阅读
- javascript - 为什么可以将构造函数原型分配给对象及其含义
- python - 如何处理 TypeError:'Thread' 类型的对象不是 JSON 可序列化的?
- ios - 在 AppDelegate.swift 中没有调用 userActivity 函数
- json - Flutter 无法将字符串转换为双精度
- multithreading - 循环缓冲区的填充速度比 AVAudioSourceNode 渲染块可以从中读取数据快
- google-sheets - COUNTIF 其他 google sheet 的 A2 行 by IMPORTRANGE
- javascript - Firebase Cloud Firestore 读写数据
- reactjs - React Form单handleChange函数具有多个输入和setState到复杂对象
- flutter - 在颤动中初始化文件
- javascript - 关于文本和内容从块中滑出的问题。它已经完成了 CSS 和 HTML