我有一些代码可以解析这样的 XML 文件:
[doc := (XML.XMLParser new) parse: aFilename asURI] on: XML.SAXParseException
do: [:ex | MyCustomError raiseSignal: ex description].
我现在想通过将 XML 文件移动到名为“Failed”的文件夹来处理堆栈中较高层的 MyCustomError,但我收到共享冲突错误,因为解析器没有机会关闭该文件。
如果我像这样改变我的代码,它会起作用,但我想知道是否有更好的方法:
[doc := (XML.XMLParser new) parse: aFilename asURI] on: XML.SAXParseException
do: [:ex | description := ex description].
description ifNotNil: [MyCustomError raiseSignal: description].
最佳答案
代码可以针对可恢复(非致命)的错误发出异常信号;如果您捕获这样的错误,您就无法确定 XMLParser 是否打算继续运行。例如,不知道是在交互模式还是批处理模式下调用的代码可能会发出简单信息性消息的异常信号;调用者会知道是否以交互方式(例如使用消息提示)或批处理方式(将消息写入日志文件)来处理它。
为了使其正常工作,以这种方式进行通信的代码片段必须知道它们正在处理的错误类型。 (这通常是通过严重性级别来完成的,通过异常对象中的状态或引发不同类别的异常进行编码。)如果您检查 ex 对象,您可能会看到此信息。
无论如何,证据表明 XMLParser 将 SAXParseException 视为可恢复错误(否则,它应该自行清理)。既然如此,您的“修复”似乎足够合适。
关于error-handling - 解析 XML 文件时的错误处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14962458/