2013-02-19 119 views
2

当我有一些代码来分析这样的XML文件:错误处理解析XML文件

[doc := (XML.XMLParser new) parse: aFilename asURI] on: XML.SAXParseException 
    do: [:ex | MyCustomError raiseSignal: ex description]. 

我现在要处理的MyCustomError在堆栈中较高的,由XML文件移动到文件夹名为'失败',但我得到了共享违规错误,因为解析器没有机会关闭该文件。

如果我改变我的代码,这样它的工作原理,但我不知道是否有更好的办法:

[doc := (XML.XMLParser new) parse: aFilename asURI] on: XML.SAXParseException 
     do: [:ex | description := ex description]. 
description ifNotNil: [MyCustomError raiseSignal: description]. 

回答

1

代码可以用信号对作为可恢复(非致命)的错误异常;如果你陷入这样的错误,你不能确定XMLParser不打算继续前进。例如,不知道它是以交互模式还是批处理模式被调用的代码可能表示一个简单的信息性消息的例外;调用者将知道是否以交互方式(例如使用消息提示)或批处理方式(将消息写入日志文件)处理它。

为了使这个工作,以这种方式进行通信的代码段必须知道它们正在处理的错误是什么样的。 (这通常是在严重性级别下完成的,可以通过异常对象中的状态进行编码,也可以通过引发不同类别的异常来进行编码。)如果检查ex对象,您可能会看到此信息。

在任何情况下,证据都表明XMLParser将SAXParseException视为可恢复的错误(否则,它应该自行清理)。如此,你的“修复”似乎就够了。

1

您还可以在ReadStream而不是URL上运行解析器。然后,您可以将代码封装在一个确保块中,关闭readStream。