2

我有一些代码可以解析这样的 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].
4

2 回答 2

1

对于可恢复的错误(非致命),代码可以发出异常信号;如果您捕获这样的错误,您不能确定 XMLParser 不打算继续运行。例如,不知道是在交互模式还是批处理模式下调用的代码可能会发出简单信息消息的异常信号;调用者将知道是以交互方式(例如使用消息提示)还是批处理方式(将消息写入日志文件)来处理它。

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

无论如何,证据表明 XMLParser 将 SAXParseException 视为可恢复的错误(否则,它应该自行清理)。既然如此,您的“修复”似乎足够合适。

于 2013-02-19T23:45:44.000 回答
1

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

于 2013-02-20T10:21:45.453 回答