当前位置: 首页 > 知识库问答 >
问题:

抛出选中异常与抛出包装的RuntimeException

邢同
2023-03-14

在许多地方,我得到了几个已检查的异常,如IOException、ParseException、JSoneException等。我必须做出两个选择之一-

>

  • 通过在方法签名的末尾添加抛出来抛出相同的异常。

    将检查的异常包装在RuntimeException(或一些自定义实现)中,然后抛出它,以便调用者不必在任何地方添加throws子句并检查异常。

    在第一种情况下,我将不得不到处抛出,但我的客户可以通过捕捉checkedException并继续工作来决定不死。然而,在第二种情况下,RuntimeException实际上可能会迫使客户端失败,因为人们通常不会在任何地方捕捉到泛型/RuntimeException。另外,使用第二种方法可以更容易地使用Java 8 lambda,因为它在检查异常时不能很好地工作。

    两者中哪一个更受欢迎?为什么?是否有可遵循的首选实践?

  • 共有3个答案

    从元明
    2023-03-14

    还有第三个选项,即抛出相同的选中异常,但要“软化”它。CheckedExceptions仅在编译时强制执行,通过将异常转换为可丢弃的,您可以安全地抛出它,而不会让编译器抱怨。下面是一个示例实现(在cyclops函数中,我提供了一个库,或者您可以复制和粘贴:))

    根据Andy Turner的评论更新简化的ExceptionSoftener类。

    public class ExceptionSoftener {
    
    
       public static <T extends Throwable> T softenedException(final T e) {
           uncheck(e);
           return e; //never reached.
       }
    
       private static <T extends Throwable> void uncheck(Throwable throwable) throws T {
           throw (T) throwable;
    
       }
    
     }
    
       public void methodThrowsIOException(){      
           throw ExceptionSoftener.softenedException(new IOException("checked exception, but no declaration required!"));
       }
    
    公羊绪
    2023-03-14

    (1)通过在方法签名末尾添加throws抛出相同的已检查异常:

    如果调用方可以从异常中恢复,或者至少必须基于此做出一些决定/取得一些进展,请使用此选项

    (2) 将选中的异常包装在RuntimeException(或一些自定义实现)中:

    如果调用程序无法恢复,请使用此选项(Spring/Hibernate框架中的大多数异常都遵循此模式)

    干鑫鹏
    2023-03-14

    有两种异常:调用中可能出现的异常和原则上意外的异常(并且应用程序代码可能无法以有意义的方式工作)。对于第一种(例如文件操作的IOException),检查异常(方法签名末尾带有“throws”)非常好。

    对于第二种情况,我认为可以将其包装在RuntimeException中,原因如下(不必在任何地方添加抛出)。所有软件都应该准备好在顶层捕获RuntimeExceptions作为“最后一道防线”,否则它们会接受RuntimeException将结束程序(例如对于命令行应用程序来说,这通常是可以接受的)。

    第二种情况的一个示例是缺少必要的配置文件。我会将IOException作为RuntimeException重新显示。

    顺便说一下,还有第三种经常使用的方法:抛出特定于应用程序的异常。例如,这个异常可以称为“MyConfigurationException”。我认为只有当应用程序能够捕获这个异常并智能地处理它时,这才有用。

     类似资料:
    • 抛出异常的行为是否可能抛出不同的异常? 为了抛出异常,必须(可选地)分配新对象,并调用其构造函数(隐式调用fillinstacktrace)。在某些情况下,听起来像addSupressed也被称为。那么如果没有足够的内存会发生什么呢?JVM是否需要预分配内置异常?例如,(1/0)会抛出OutOfMemoryError而不是ArithmeticException吗? 此外,构造函数是一个方法调用,因

    • 异常是[ERROR: flutter/lib/ui/ui_dart_state.cc(177)]未处理的异常:MisSingPluginExcture(在通道plugins.flutter.io/path_provider上没有找到方法getTemporaryDirectory的实现)。我实现这个包到我的样本项目,它的工作。但是当我试图实现我的官方项目时,它抛出了异常。我怎么才能修好它?非常感谢

    • 问题内容: 考虑以下代码: 无需添加方法签名即可编译该代码。(它与同样表现到位,太)。 我理解为什么 可以 安全地运行它,因为实际上不能将其引发在块中,因此不能引发已检查的异常。我有兴趣知道在何处指定此行为。 并非永远都不会达到目标:以下代码也会编译: 但是,如果抛出一个检查的异常,它不会像我期望的那样编译: 在JLS Sec 11.2.2中 ,它说: 一,其抛出的表达式语句(§14.18)具有静

    • 问题内容: 我试图在Netbeans中重构一个大型程序,但我有点迷茫。我从来没有非常模块化,但是现在通过实际学习如何做到这一点来尝试纠正这种情况,并在将来纠正这种情况。不幸的是,我在将某些教程翻译成我的程序时遇到了麻烦。所以我希望这里有人可以帮忙。目前,我正在尝试分解一部分采用特定格式的文件并制成表格的代码。我知道我需要创建一个类并使用它来创建表对象,但是我不确定如何做。我有一个主文件,用于获取文

    • 问题内容: 我目前正在使用play2框架。 我有几个正在抛出的类,但是play2s全局处理程序使用throwable而不是异常。 例如我的一门课是抛出一个。我是否可以检查可抛物体(如果是)? 问题答案: 您可以使用它来检查它是否存在。 例: 假设是参考。

    • throw 关键字表示发生了异常,称为抛出异常。throw 通常指定一个操作数(我们将介绍不指定操作数的特殊情况)。throw 的操作数可以是任何类型,如果操作数是个对象,则称为异常对象。也可以抛出条件表达式而不是抛出对象,可以抛出不用于错误处理的对象。 抛出异常时,指定相应类型的最近一个异常处理器(对抛出该异常的try块)捕获这个异常。try块的异常处理紧接在try块后面。 抛出异常时,生成和初