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

标签 error-handling smalltalk visualworks

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

相关文章:

zend-framework - Zend 错误 Controller 停止工作 500

observer-pattern - 在 Smalltalk/VisualWorks 中实现观察者模式

smalltalk - 如何在 Smalltalk 中通过其 stdin、stdout、stderr 与子进程交互?

Smalltalk - 以字母数字为键的字典等效项?

smalltalk - 如何检查父类(super class)之一是否包含具有特定名称的类变量?

smalltalk - 尝试在 Smalltalk VisualWorks 的所有类中搜索字符串?

floating-point - 在 Smalltalk 单元测试用例中,断言不应该失败

swift - 如何: Detect if a observable has not emitted any events for specific time in RxSwift

mysql - SQL 插入 Access 2010 时出错

c++ - 递归函数抛出错误