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

URLの代わりにReadStreamでパーサーを実行することもできます。次に、readStreamを閉じるensureブロックでコードをラップできます。

于 2013-02-20T10:21:45.453 に答える