8

非常に特定の問題に対して例外 (Exception) を発生させる非標準モジュール (同僚の 1 人によって作成された) をインポートするプログラム (kivy を使用した gui) があります。プログラムでポップアップを発生させることができるように、その特定のモジュールから発生したすべての例外をキャッチしたいと考えています。では、特定のモジュールから発生した例外をキャッチする最善の方法は何でしょうか?

私はこれを試しました

toc はモジュール名です

import toc
...
...
try:
    ...
    ...
except toc.Exception:
    ...

しかし、これは機能していないようです。モジュールに属性 'Exception' がないことを示す AtrributeError が生成されます。私は何を間違っていますか?

編集:もう1つの質問:

私が持っている場合:

try:
    ...
    try:
        ....
    except:
        some small block code
except:
    some large block code

例外処理はローカル ブロック内で機能しますか? 小さいブロックでエラーが発生した場合、エラー処理は「いくつかの小さなブロック コード」に進むのでしょうか、それとも「大きなブロック コード」に進むのでしょうか?

4

2 に答える 2

5

特定のタイプのすべての例外をキャッチできますが、正しいタイプを指定する必要があります。あなたtoc.Exceptionは例外クラスではありません。

通常、主にモジュールの設計に応じて、次の 3 つのアプローチがあります。

  • モジュールにいくつかの一般的な例外クラスが含まれている場合 (いくつかの API を処理し、すべての API エラーが基本モジュール クラスから継承されるなど)、このクラスを使用してすべてのエラーをキャッチします。
  • モジュールにそのような基本エラー クラスがなく、独自の例外クラスがある場合は、それらすべてをキャッチできます。
  • すべてのエラーを (KeyErrorまたはのように) キャッチしたい場合はValueError、次のようにしてみてください。

    try:
        # ... some external module call ...
    except:
        # ... some exception handling ...
    

    (できれば、モジュールエラーを含む可能性が高い大きなブロックではなく、単一の呼び出しに対して)

ただし、エラーが発生した場合、これでは十分な情報が得られないことに注意してください (たとえば、呼び出そうとしている関数がそこに存在しないことを推測する必要があります)。

また、問題を解決する他の方法がないことを確認してください。危険なほどおむつパターンの実装に近づいているため、キャッチしたい例外に明示的なクラスを与えることでそれを避ける必要があります。

于 2013-01-08T01:18:47.523 に答える