包含多个异常的自定义异常:鼓励与否?

时间:2015-04-09 12:07:46

标签: java jar exception-handling checked-exceptions

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

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

在编写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();

    }

}

}

2 个答案:

答案 0 :(得分:3)

您可以将原因(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
}

答案 1 :(得分:2)

根据this帖子,将所有例外包装在一起并不好。


如果你想包装它们,那么

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

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

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

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