2

Universal Feed Parserを使用して、DjangoWebサイトの外部フィードからコンテンツを取得しようとしています。たとえば、ユーザーがフィードではないURLを指定した場合など、ユーザーエラー処理が必要です。feedparserが誤った入力にどのように応答するかを試したところ、feedparserが例外をまったくスローしないことに驚きました。たとえば、HTMLコンテンツでは、HTMLコードからいくつかの情報を解析しようとし、存在しないドメインでは、ほとんど空の辞書を返します。

{'bozo': 1,
'bozo_exception': URLError(gaierror(-2, 'Name or service not known'),),
'encoding': 'utf-8',
'entries': [],
'feed': {},
'version': None}

その他の誤った入力は、返されたディクショナリのstatus_codeまたはの値に現れます。namespaces

それで、無限のカスケードに頼ることなく、正気のエラーチェックを行うための最良のアプローチはif .. elif .. elif ...何ですか?

4

1 に答える 1

5

feedparserドキュメントによると、 BozoDetectionセクションで:

Universal Feed Parserは、整形式のXMLであるかどうかに関係なく、フィードを解析できます。ただし、一部のアプリケーションでは、整形式でないフィードについてユーザーを拒否または警告したい場合があるため、Universal Feed Parserは、フィードが整形式でないことを検出すると、ボゾビットを設定します。

(私の意見では、すべての例外をキャッチして別の形式で返すことはあまり良い習慣ではありませんが、「アプリケーションは整形式でないフィードについて警告するだけかもしれない」ので、それはまさにそれが機能する方法です。)

したがって、任意のURLでフィードを解析しようとした後、「bozoビット」をチェックして、対応する例外を再発生させることができます。

f = feedparser.parse('http://example.com')
if f.bozo:
    raise f.bozo_exception

タイプとメッセージに従って、またはによって返されるオブジェクトの他の属性に対してアサーションを作成することによって、例外を処理できますfeedparser.parse(たとえば、f.feed空でない必要がありf.status、200に等しいf.entries必要があり、空でf.versionない必要があり、有効なフィード形式である必要があります)。バージョンなど)、アプリケーションにとって最も合理的と思われるものは何でも。

于 2010-12-25T19:56:06.500 に答える