Java 萨克森9:错误侦听器';在TransformerFactory.newFactory()调用期间,s fatalError异常从不冒泡

Java 萨克森9:错误侦听器';在TransformerFactory.newFactory()调用期间,s fatalError异常从不冒泡,java,xml,exception-handling,saxon,Java,Xml,Exception Handling,Saxon,如果包含的XML文件格式不正确(即缺少某个标记闭包),我需要一个TransformerException,以防出现致命错误。与规格相反,错误被完全抑制。这是一个纯粹的XML问题,而不是XSL问题 try { TransformerFactory factory = TransformerFactory.newInstance(); MyErrorListener errorListener = new MyErrorListener(); factory.setError

如果包含的XML文件格式不正确(即缺少某个标记闭包),我需要一个TransformerException,以防出现致命错误。与规格相反,错误被完全抑制。这是一个纯粹的XML问题,而不是XSL问题

try {
    TransformerFactory factory = TransformerFactory.newInstance();
    MyErrorListener errorListener = new MyErrorListener();
    factory.setErrorListener(errorListener);
    StreamSource ss = new StreamSource(new StringReader(badXslText), "file:" + xslPath);
    Transformer xf = factory.newTransformer(ss); // This is where MyErrorListener.fatalError below happens.. but that never bubbles up for some reason
    System.out.println("Nothing went wrong!");  // Yes it effing did!
} catch (TransformerException e) {
    //Why isn't this getting hit?
    String message = e.getMessage();
    throw new Exception("Problem during transform. "+message);
}
以下是赤裸裸的错误监听器(为了简洁起见,删除了几个方法):

公共静态类MyErrorListener实现ErrorListener{
private ArrayList messages=new ArrayList();
public void fatalError(TransformerException e)抛出TransformerException{
添加(e);
抛出e;//这已达到,但从未在顶层捕获
}
公共列表getMessages(){
返回消息;
}
}

这一次我几乎要发疯了。

我有一个与此基本相同的单元测试,它适合我。您能否将其扩展为一个完全独立的测试(包括完整的输入文件,以及包含所有include的完整Java模块,等等),并说明您使用的是哪一个特定版本的Saxon:“Saxon 9”不是非常具体。我将召集一个测试,但看起来这是一个与双嵌套xsl include相关的问题,也就是说,一个文件包含一个包含另一个缺少闭包或类似文件的文件。不确定为什么最内层的xsl不会使newTransformer调用爆炸,即使它仍然记录错误。因此,您对该版本的评论是相关的——这是旧版本saxon中的一个bug。我使用的是9.3版,它仍然存在您在这里概述的问题:我更新了saxon,问题就消失了。感谢您的所有工作,感谢您报告诊断结果。我有一个与此基本相同的单元测试,它适合我。您能否将其扩展为一个完全独立的测试(包括完整的输入文件,以及包含所有include的完整Java模块,等等),并说明您使用的是哪一个特定版本的Saxon:“Saxon 9”不是非常具体。我将召集一个测试,但看起来这是一个与双嵌套xsl include相关的问题,也就是说,一个文件包含一个包含另一个缺少闭包或类似文件的文件。不确定为什么最内层的xsl不会使newTransformer调用爆炸,即使它仍然记录错误。因此,您对该版本的评论是相关的——这是旧版本saxon中的一个bug。我使用的是9.3版,它仍然存在您在这里概述的问题:我更新了saxon,问题就消失了。感谢您所做的一切工作,感谢您报告诊断结果。
public static class MyErrorListener implements ErrorListener {
    private ArrayList<String> messages = new ArrayList<String>();
    public void fatalError(TransformerException e) throws TransformerException {
        messages.add(e);
        throw e; //This is reached, but never caught on the top level
    }
    public List<String> getMessages() {
        return messages;
    }
}