Python 3で例外を文字列に変換する 質問する

Python 3で例外を文字列に変換する 質問する

このPython 3.2コードがなぜ

try:    
    raise Exception('X')
except Exception as e:
    print("Error {0}".format(str(e)))

問題なく動作します(WindowsシェルのUnicodeエンコードを除く)が、これは

try:    
    raise Exception('X')
except Exception as e:
    print("Error {0}".format(str(e, encoding = 'utf-8')))

投げるTypeError: str への強制: バイト、バイト配列、またはバッファのようなオブジェクトが必要です。例外が見つかりました?

エラーをカスタムエンコーディングの文字列に変換するにはどうすればいいですか?

編集

メッセージに \u2019 がある場合も機能しません。

try:    
    raise Exception(msg)
except Exception as e:
    b = bytes(str(e), encoding = 'utf-8')
    print("Error {0}".format(str(b, encoding = 'utf-8')))

しかし、なぜ str() は例外を内部的にバイトに変換できないのでしょうか?

ベストアンサー1

Python 3.x では、Unicode 文字が含まれている場合でも、str(e)任意の文字を文字列に変換できるはずです。Exception

したがって、例外がカスタム__str__()メソッドで実際に UTF-8 でエンコードされたバイト配列を返さない限り、str(e, 'utf-8')期待どおりに動作しません (RAM 内の 16 ビット Unicode 文字列を UTF-8 でエンコードされたバイト配列として解釈しようとします...)

私の推測では、問題は(つまり、Python Unicode 文字列をコンソールにダンプされるものに変換するステップ)str()ではないと思います。解決策については、この回答を参照してください。print()Python、Unicode、Windows コンソール

おすすめ記事