例外をunicodeで

ソースコードUTF-8で書いていると、pythonスタックトレース(stack trace)画面がおかしい。環境は Windows 2000Python 2.5。

# -*- coding: utf-8 -*-
raise IndexError, 'いきなりエラー'

というコードを実行すると、

Traceback (most recent call last):
File "C:\test.py", line 2, in
raise IndexError, '縺・″縺ェ繧翫お繝ゥ繝シ'
IndexError: 縺・″縺ェ繧翫お繝ゥ繝シ

コード行(最後から2行目)と例外行(最終行)の両方が化ける。

# -*- coding: utf-8 -*-
raise IndexError, u'いきなりエラー'

メッセージの文字列に u を付け加えると、

Traceback (most recent call last):
File "C:\test.py", line 2, in
raise IndexError, u'縺・″縺ェ繧翫お繝ゥ繝シ'
IndexError

最後の例外行が途中から表示されない。

# -*- coding: utf-8 -*-
raise IndexError, u'いきなりエラー'.encode('shift_jis')

しょうがないので、わざわざ変換してやると、

Traceback (most recent call last):
File "C:\test.py", line 2, in
raise IndexError, u'縺・″縺ェ繧翫お繝ゥ繝シ'.encode('shift_jis')
IndexError: いきなりエラー

ちゃんと表示されますね。あきらめて英語で書くか。