Kotlin-抛出自定义异常

我怎么能在 Kotlin 抛出一个自定义的例外? 我没有真正从文件中得到那么多..。

在文档中,它描述了每个异常需要什么,但是我到底如何实现它呢?

67908 次浏览

像这样:

实施

class CustomException(message: String) : Exception(message)

用法

 fun main(args: Array<String>) {
throw CustomException("Error!")            // >>> Exception in thread "main"
}                                              // >>> CustomException: Error!

更多信息: 例外

需要记住的一点是: 如果您使用的是 IntelliJ IDE,只需要简单地复制/粘贴 Java 代码就可以将其转换为 Kotlin。

现在回到你的问题。如果你想创建一个自定义的 Exception,只需扩展 Exception 类如下:

class TestException(message:String): Exception(message)

然后像这样扔过去:

throw TestException("Hey, I am testing it")

这些答案大多忽略了 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个构造函数,这是容易出错的。

为什么不把两个答案合并起来呢

假设你想在计算器中抛出一个自定义的异常。日志记录是可选的,你可以移除 init 块

class CalculationException constructor(message: String= "ERROR: Invalid Input", cause: Throwable): Exception(message, cause) {
init {
Log.e("CalculationException", message, cause)
}
}

用法:

没有留言

    throw(CalculationException())

输出 : 默认消息

由: CalculationException: ERROR: InvalidInput 引起


或者

只有信息,没有原因

    throw(CalculationException("Some Weird Exception"))
enter code here

输出 : 自定义消息

进程: PID: 23345 异常: 无法启动活动组件信息{计算异常: 一些奇怪的异常


或者

信息和原因

    throw(CalculationException("Divide ByZero", ArithmeticException()))

2021-08-1219:36:55.70517411-17411/ 异常: 除以零 异常

我知道这很老套,但我想详细说明@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 类必须为每个可接受输入的组合有四个构造函数。此外,messagecause在 Exception 中都被允许是 null,所以如果我们试图100% 兼容 Exception,那么我们的 null也应该是 null

我们甚至使用 需要作为第二个构造函数的唯一原因是为了避免在 Kotlin 代码中使用命名参数语法: CustomException(cause = fooThrowable) vs Exception(fooThrowable)