【问题标题】:Kotlin - Throw Custom ExceptionKotlin - 抛出自定义异常
【发布时间】:2017-07-18 09:34:56
【问题描述】:

如何在 Kotlin 中引发自定义异常?我并没有真正从文档中得到那么多...

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

【问题讨论】:

标签: exception kotlin


【解决方案1】:

这些答案中的大多数只是忽略了 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,而不是这个答案真的很有帮助。
  • @loaded02 抱歉,您能详细说明一下吗?在什么情况下你需要一个异常不起作用的可抛出对象? Exception 扩展 Throwable,因此任何 Exception 都可以是 Throwable
  • @DownloadPizza 你是对的。无需更改。
  • @TimBaverstock 查看下面的 R. Agnese 答案,样板文件更少
【解决方案2】:

我知道这是旧的,但我想详细说明@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,我们的也应该是。

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

【讨论】:

  • 很好,在编辑中提到了你。这是对默认参数的滥用,我喜欢它
【解决方案3】:

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

现在回答你的问题。如果要创建自定义异常,只需扩展异常类,如:

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

然后像这样扔:

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

【讨论】:

  • 您忘记将消息传递给异常构造函数 :)
  • 我发现你只需要在var前面加上override关键字即可:)
  • 为什么不用 val message 而不是 var?参数没有理由是可变的。
  • 为什么我们需要覆盖这里的消息?
  • @Deepak 是的,我们不需要它,将其删除。感谢您的关注。
【解决方案4】:

像这样:

实施

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

用法

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

欲了解更多信息:Exceptions

【讨论】:

    【解决方案5】:

    为什么不合并两个答案

    假设您想在计算器中抛出一个自定义异常。日志记录是可选的,您可以删除初始化块

    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

    【讨论】:

      猜你喜欢
      • 2011-10-06
      • 2011-05-30
      • 1970-01-01
      • 2020-08-03
      • 1970-01-01
      • 2012-10-28
      • 2021-12-22
      • 2020-02-18
      相关资源
      最近更新 更多