是否可以使用IllegalStateException捕获所有子异常?

Dav*_*tti 5 java api exception

我想知道在这种情况下使用IllegalStateException是否是API的一个很好的设计选择.

场景: 我有一个函数,它检查XML文档是否格式良好,并带有以下签名:

public boolean isXMLDocumentWellFormed(InputStream inXMLDocument)
Run Code Online (Sandbox Code Playgroud)

此函数使用以下代码段加载XML文档:

    boolean isXMLDocWellFormed = false;

    // Setup document builder
    DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory
            .newInstance();

    if (docBuilderFactory == null)
        throw new IllegalStateException(
                "The DocumentBuilderFactory cannot be instanciated");
    try {
        DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder();

        // Parse document
        Document doc = docBuilder.parse(inXMLDocument);

        if (doc != null)
            isXMLDocWellFormed = true;

    } catch (ParserConfigurationException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
        throw new IllegalStateException(e);
    } catch (SAXException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
        throw new IllegalStateException(e);
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
        throw new IllegalStateException(e);
    }

    return isXMLDocWellFormed;
Run Code Online (Sandbox Code Playgroud)

API的设计非常易于使用.不过,我想提供API用户知道为什么XML文档不能被选中的可能性(例如:的DocumentBuilderFactory无法创建的DocumentBuilder对象)而不万吨的checked exception的压倒他们,他们将不得不面对.

我对这个设计的担忧是:

a)使用一个单独的Exception类型(即IllegalStateException)来返回每个可能捕获的异常,以指示无法执行检查是个好主意吗?我会说是的,因为用户除了这个功能之外还有两件事:

  1. 要知道XML文档是否格式良好.
  2. 要知道函数无法返回答案(例如由于异常),为什么函数无法提供答案.

b)如果 a)的答案为否,那么最合适的例外名称或解决方案是什么?为什么

问候,

The*_*eLQ 0

如果您开发的是一个 API,那么您应该将所有异常包装在一个主异常中。这样你就不会泄露实现细节。然而,您的个人品味可能会有所不同

但是我认为 IllegalStateException 不太适合这里。它非常通用并且不能解释问题(IO 异常是非法状态?)。最好的解决方案是创建您自己的自定义异常类并抛出它。

作为您或其他任何人的辅助节点,如果您抛出异常,请不要打印异常。