【发布时间】:2017-07-18 09:34:56
【问题描述】:
如何在 Kotlin 中引发自定义异常?我并没有真正从文档中得到那么多...
在文档中,它描述了每个异常需要什么,但我该如何实现呢?
【问题讨论】:
-
我猜官方指南kotlinlang.org/docs/reference/exceptions.html描述得很好。还是我误会了?
-
好吧,现在明白了...
如何在 Kotlin 中引发自定义异常?我并没有真正从文档中得到那么多...
在文档中,它描述了每个异常需要什么,但我该如何实现呢?
【问题讨论】:
这些答案中的大多数只是忽略了 Exception 有 4 个构造函数的事实。 如果您希望能够在正常异常有效的所有情况下使用它,请执行以下操作:
class CustomException : Exception {
constructor() : super()
constructor(message: String) : super(message)
constructor(message: String, cause: Throwable) : super(message, cause)
constructor(cause: Throwable) : super(cause)
}
这会覆盖所有 4 个构造函数并只是传递参数。
编辑:请向下滚动到R. Agnese 答案,它设法做到这一点而不会覆盖 4 个容易出错的构造函数。
【讨论】:
Throwable 更改为 Exception,而不是这个答案真的很有帮助。
我知道这是旧的,但我想详细说明@DownloadPizza 的答案:https://stackoverflow.com/a/64818325/9699180
您实际上并不需要四个构造函数。您只需要两个来匹配基 Exception 类的四个:
class CustomException(message: String? = null, cause: Throwable? = null) : Exception(message, cause) {
constructor(cause: Throwable) : this(null, cause)
}
Exception 基类来自 Java 标准库,而 Java 没有默认参数,因此 Java 类必须为每个可接受的输入组合提供四个构造函数。此外,message 和 cause 都允许在 Exception 中为 null,所以如果我们试图 100% 兼容 Exception,我们的也应该是。
我们甚至需要第二个构造函数的唯一原因是避免在 Kotlin 代码中使用命名参数语法:CustomException(cause = fooThrowable) vs Exception(fooThrowable)。
【讨论】:
要记住一件事:如果您使用的是 IntelliJ IDE,只需简单地复制/粘贴 Java 代码即可将其转换为 Kotlin。
现在回答你的问题。如果要创建自定义异常,只需扩展异常类,如:
class TestException(message:String): Exception(message)
然后像这样扔:
throw TestException("Hey, I am testing it")
【讨论】:
像这样:
class CustomException(message: String) : Exception(message)
fun main(args: Array<String>) {
throw CustomException("Error!") // >>> Exception in thread "main"
} // >>> CustomException: Error!
欲了解更多信息:Exceptions
【讨论】:
假设您想在计算器中抛出一个自定义异常。日志记录是可选的,您可以删除初始化块
class CalculationException constructor(message: String= "ERROR: Invalid Input", cause: Throwable): Exception(message, cause) {
init {
Log.e("CalculationException", message, cause)
}
}
用法:
没有消息
throw(CalculationException())
输出:默认消息
原因:CalculationException: ERROR: Invalid Input
或
只有消息没有原因
throw(CalculationException("Some Weird Exception"))
enter code here
输出:自定义消息
进程:PID:23345 java.lang.RuntimeException:无法启动活动 ComponentInfo{CalculationException:一些奇怪的异常
或
消息和原因
throw(CalculationException("Divide ByZero", ArithmeticException()))
2021-08-12 19:36:55.705 17411-17411/ E/CalculationException: 除以零 java.lang.ArithmeticException
【讨论】: