Error handling 解析XML文件时的错误处理

Error handling 解析XML文件时的错误处理,error-handling,smalltalk,visualworks,Error Handling,Smalltalk,Visualworks,我有一些代码可以解析如下XML文件: [doc := (XML.XMLParser new) parse: aFilename asURI] on: XML.SAXParseException do: [:ex | MyCustomError raiseSignal: ex description]. 现在,我想通过将XML文件移动到名为“Failed”的文件夹来处理堆栈中更高的MyCustomError,但由于解析器没有机会关闭该文件,因此出现了共享冲突错误 如果我像这样修改代码,它

我有一些代码可以解析如下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视为可恢复的错误(否则,它应该在自己之后清除)。既然如此,您的“修复”似乎足够合适。

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