包含多个异常的自定义异常:鼓励还是不鼓励?

Posted

技术标签:

【中文标题】包含多个异常的自定义异常:鼓励还是不鼓励?【英文标题】:Custom Exception that wraps Multiple Exceptions : Encouraged or Not? 【发布时间】:2015-06-14 19:03:31 【问题描述】:

我正在编写一个用于访问数据库的 Java 库。 我将异常抛给使用 JAR 库以他/她想要的方式处理它的最终程序员

我编写了一个自定义异常(如下所示)来将特定于连接的异常包装在一起,这样最终程序员就不必在他的代码中捕获所有这些异常。 (方便他)

在编写 Java 库时,这是一个好习惯吗? 通过使用它,用户只需在他的代码中捕获 NConnectionException。

public class NConnectionException extends Exception 
private static final Logger logger = LoggerFactory.getLogger(NConnectionException.class);
public NConnectionException(Exception e) 

    if (e instanceof NullPointerException) 
        logger.error("ERROR IN READING DF");
        e.printStackTrace();
    

    else if (e instanceof FileNotFoundException) 
        logger.error("FILE NOT FOUND");
        e.printStackTrace();

     else if (e instanceof ParserConfigurationException)
    
        logger.error("PARSE CONF ERR");
        e.printStackTrace();

    
    else if (e instanceof org.xml.sax.SAXException)
    
        logger.error("SAX ERR");
        e.printStackTrace();

    
    else if (e instanceof IOException)
    
        logger.error("IO ERR");
        e.printStackTrace();

    


【问题讨论】:

在您的情况下,您没有在自定义异常中存储任何堆栈跟踪或错误消息。使用e.printStackTrace(); 是一种不好的做法。 您可以将多个异常存储在NConnectionException 内的列表中,并让您的调用程序决定它需要从异常中获取哪些数据。我建议不要处理运行时异常,即未经检查的异常。 通过这样做我必须遍历异常列表并找到抛出的异常?还是我没有正确理解你所说的?非常感谢您的帮助! 我没有打印堆栈跟踪,而是抛出了异常对象。这是鼓励吗? 是的,调用程序需要遍历它。你的程序是否抛出多个异常at a time?因为这只会发生在多线程环境中。 【参考方案1】:

您可以将原因(Throwable)传递给自定义异常。查看Exception javadoc 了解更多信息。

编辑:

public class CustomException extends Exception 
    public CustomException(Throwable t) 
        super(t);
    


public void testMethod(String s) throws CustomException 
   try 
       int integer = Integer.parseInt(s);
    catch (NumberFormatException e) 
       throw new CustomException(e);
   


try 
    testMethod("not a number");
 catch (CustomException ce) 
    ce.printStackTrace(); // this will print that a CustomException
                          // with the cause NumberFormatException has occured.
    ce.getCause(); // this will return the cause that
                   // we set in the catch clause in the method testMethod

【讨论】:

根据您的建议,我使用了这个构造函数,public Exception(String message,Throwable Cause),并将原因扔给了我的 customException。我不清楚下一步是什么。请详细说明一下。 我给你加了一个例子【参考方案2】:

根据this 的帖子,将所有异常包装在一个单一的并不好。


如果你想包装它们,那么

由于您的程序一次只会抛出一个异常,因此无需在NConnectionException 中存储异常列表。

您可以在 NConnectionException 类中创建单个异常对象。可以参考this结构。

并将抛出的异常存储在该对象中并返回NConnectionException类的新创建对象。让调用程序捕获 NConnectionException 异常并取出存储的对象并采取相应的行动。

注意:一般我们不处理未经检查的异常(如 NullPointerException),调用程序会处理它。

【讨论】:

以上是关于包含多个异常的自定义异常:鼓励还是不鼓励?的主要内容,如果未能解决你的问题,请参考以下文章

PCL 文件中的自定义异常

Java中的自定义异常捕获方式

如何使具有多个 init args 的自定义异常类可腌制

Spring Boot 异常处理数据库错误的自定义异常?

存储过程未返回预期的自定义异常消息

为 Java 中的自定义检查异常编写 JUnit 测试用例?