2013-02-19 121 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。