動的Exceptionクラス

id:jbkingさんとこで、
メタで例外クラスを作成してもraiseで怒られる
http://d.hatena.ne.jp/jbking/20061221/p1

ということで、2.4時点ではExceptionはクラシカルクラス、typeでメタクラス作るにはニュースタイルでないといけない。

type以外で作成するとなると、ローカルクラスを使えばいいかな。

def createException(name):
    class LocalException (Exception):
        pass
    LocalException.__name__ = name
    return LocalException


E1 = createException("E1")
E2 = createException("E2")
print E1, E2
print E1 == E2

出力結果

__main__.E1 __main__.E2
False

一応できるな。
キャッチできるか確認。

try:
    raise E1()
except E2:
    print "catch E2"
except E1:
    print "catch E1"

出力

catch E1

おお、うまくいった。
まあ、2.5に移行すれば不要になる方法だが。