Exception 什么';Kotlin删除已检查异常背后的想法是什么?

Exception 什么';Kotlin删除已检查异常背后的想法是什么?,exception,intellij-idea,kotlin,checked-exceptions,Exception,Intellij Idea,Kotlin,Checked Exceptions,当我们在Java中调用抛出异常的方法时,我们如何处理这个问题 我的代码是用kotlin编写的,我使用的是用java编写的第三方库。我调用了这个库的一个方法,它在某些情况下很少抛出自定义异常。现在kotlin不强制我处理这个异常,在这种情况下应用程序会崩溃。处理这一问题的最佳方法是什么?当Java引入检查异常(编译器强制大多数异常被捕获或声明为抛出)时,这是一个相当新的想法。Java是一种比它的大多数前辈更安全的语言:所有行为都在所有平台上定义并保持一致,许多特性都是为了防止崩溃、意外行为或脆弱的

当我们在Java中调用抛出异常的方法时,我们如何处理这个问题


我的代码是用kotlin编写的,我使用的是用java编写的第三方库。我调用了这个库的一个方法,它在某些情况下很少抛出自定义异常。现在kotlin不强制我处理这个异常,在这种情况下应用程序会崩溃。处理这一问题的最佳方法是什么?

当Java引入检查异常(编译器强制大多数异常被捕获或声明为抛出)时,这是一个相当新的想法。Java是一种比它的大多数前辈更安全的语言:所有行为都在所有平台上定义并保持一致,许多特性都是为了防止崩溃、意外行为或脆弱的编码,所以检查异常与语言的理念非常吻合

但在此后的几年里,许多人得出结论,检查异常是一个错误。我不完全相信,但以下是一些原因:

  • 它们很冗长。方法通常包括许多
    try
    catch
    块,和/或声明许多异常。此外,如果在抛出异常和捕获异常之间有6个级别的方法调用,则需要用5个方法声明异常

    Kotlin删除了Java的许多样板文件,删除了检查异常也符合这一点

  • 他们鼓励不良行为

    • 试图在错误的地方处理异常,即在错误的抽象级别,在那里没有什么有用的事情可以做
    • 无意义的
      catch
      块(尤其是那些只记录错误的危险块)
    • 捕获/声明
      异常
      ,而不是特定的子类型
    • 通过在未检查的异常(如
      RuntimeException
      )中包装已检查的异常进行欺骗
  • 它们增加了模块之间的耦合。如果您使用的是添加新异常的库方法,那么所有调用该方法的代码都需要更新以处理或重新调用它

  • 它们要求在不同抽象级别之间转换异常(例如,DB访问层可能必须将套接字超时异常转换为数据库不可用异常)。这很繁琐,但为了避免暴露实现细节,这是必要的

  • 它们不能很好地处理继承。如果您正在实现/重写的方法没有声明抛出特定的已检查异常,那么您的实现也不能抛出它

  • 它们不能很好地与lambda一起工作。在Java中,lambda是使用单个抽象方法接口实现的,因此这些方法必须声明可能的异常(在这种情况下,每个用法都必须处理或声明它),或者lambda主体必须捕获异常。这两个选项都极大地增加了使用lambda所需的概念权重和代码,破坏了它们的主要优点之一的简洁性

    Kotlin的实现非常相似(尽管它使用自己的
    KFunction
    接口),并且会遇到同样的问题

有了所有这些问题,很明显,检查异常充其量也是喜忧参半。我可以理解为什么Kotlin已经消除了它们

我确实担心这可能会导致程序不那么健壮(也没有那么好的文档记录)。但在我使用Kotlin的两年中,我没有看到任何明显的例子。所以我现在暂缓判断:-)

(另见问题。)



至于如何处理您的特殊情况,我建议您像在Kotlin检查异常时一样:查看您调用的方法可以抛出哪些异常,确定如何/在何处最好地处理它们,并处理它们!仅仅因为Kotlin没有强迫你这么做,并不意味着这仍然不是一个好主意

即使在kotlin,你也可以使用try-catch块。@KaushikBurkule,我知道在kotlin中有try-catch。问题是,你如何知道你必须用in-try-catch来包装一段代码,因为kotlin编译器不强制这样做。在定义良好的API中,这应该记录在函数的kotlin文档中。在许多java代码库中都可以看到强制捕获机制,因为声明一个接口以抛出“异常”的反模式被删除,即使实际实现从未抛出任何异常。好的,在kotlin中,我们被迫检查api方法,看看它是否抛出任何异常,并相应地进行处理。这不是有点乏味吗?在Java中,如果不进行处理,就会出现编译时错误。如果我们错过了,它的生产将崩溃,那该怎么办呢?是的,这就是它的规模。我和你一样关心。。。