我怎么能在 Kotlin 抛出一个自定义的例外? 我没有真正从文件中得到那么多..。
在文档中,它描述了每个异常需要什么,但是我到底如何实现它呢?
像这样:
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个构造函数,这是容易出错的。
R. Agnese
假设你想在计算器中抛出一个自定义的异常。日志记录是可选的,你可以移除 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 类必须为每个可接受输入的组合有四个构造函数。此外,message和 cause在 Exception 中都被允许是 null,所以如果我们试图100% 兼容 Exception,那么我们的 null也应该是 null。
message
cause
null
我们甚至使用 需要作为第二个构造函数的唯一原因是为了避免在 Kotlin 代码中使用命名参数语法: CustomException(cause = fooThrowable) vs Exception(fooThrowable)。
CustomException(cause = fooThrowable)
Exception(fooThrowable)