3

Python で非常に奇妙な動作に遭遇しました。これは一貫性のない動作です。

...
except IOError as msg:
    sys.exit("###ERROR IOError: %s" % (msg))

通常、これにより次のようなメッセージが表示されます。

###ERROR IOError: [Errno 13] Permission denied: 'filename'

同じケースで、上記のコードはtuple適切なエラー メッセージの代わりに私に与えています。

###ERROR IOError: (13, 'Permission denied')

これは非常に奇妙です。すべての場合において、例外は同じ python メソッドから発生するためです。codecs.open(...)

これについてもっと不思議に思うのは、例外の処理を削除すると、常に正しいテキスト (完全なエラー メッセージ) で上位レベルに到達することです!

except IOError as msg:
    print(msg)
    raise msg

上記の例では、 のような完全なメッセージが常にIOError: [Errno 13] Permission denied: u'filename'出力されます。

なぜこれが起こっているのか、どうすればこれを防ぐことができるのか、不完全なエラーメッセージをユーザーに伝えたくありません.

この動作をテスト ファイルで再現したかったのですが、プロジェクトの外では再現できませんでした。

良い結果が得られるがそうではないsys.exit()ので、それはの使用法と関係があると思います。print(msg)sys.exit

4

3 に答える 3

5

まず、例外を再発生させるときは、絶対にしないでくださいexcept Exc as e: raise e。それは常に単純raiseで、引数はありません。これにより、トレースバックが保持されます。

いいえ、これはsys.exit例外がインスタンス化された方法とは関係がなく、すべてが関係しています。常に例外が発生しています。その文字列表現がtuple.

>>> print IOError(13, 'Permission denied')
[Errno 13] Permission denied
>>> print IOError((13, 'Permission denied'))
(13, 'Permission denied')

完全なトレースバックを表示しないと、この方法で何がエラーを発生させているのかを正確に知る方法はありません。また、私が指摘したように適切にリレイズしなければ、完全なトレースバックを取得することはできません。

于 2010-09-03T18:52:06.183 に答える
1

Python 1.5以前は、例外は文字列でした。その後、下位互換性を維持するためにクラスに変更しました。現在、例外インスタンスまたはクラスのみを発生させることができます。

私はこのようなコードがあったと想像します:

error = (13, 'Permision denied')

#more code

raise error

彼らがそれを例外に変更した後、誰かがちょうどしました:

raise IOError(error)
于 2010-09-03T19:55:19.393 に答える
0

例外の文字列表現に依存しないことをお勧めします。という名前を付けることもできますがmsg、文字列でもメッセージでもありません。それは例外インスタンスです。

そのため、タプルから独自の文字列を作成し、msg.argsそれを表示する「メッセージ」として使用することができます。

于 2010-10-03T19:09:10.790 に答える