Java 萨克森9:错误侦听器';在TransformerFactory.newFactory()调用期间,s fatalError异常从不冒泡
如果包含的XML文件格式不正确(即缺少某个标记闭包),我需要一个TransformerException,以防出现致命错误。与规格相反,错误被完全抑制。这是一个纯粹的XML问题,而不是XSL问题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
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;
}
}