Python user-defined exceptions placement and catching
我对python还不太熟悉,我不知道将我的用户定义的异常放在什么地方最好,以及在哪里捕获它们。
例如,我有一个启动游戏的程序,当游戏停止时,会引发一个用户定义的异常(stopgame)。我应该从游戏外部捕获这个异常,因为游戏正在抛出这个异常。但是,例外是特定于游戏的,所以例外的定义应该在游戏模块中(或者可能是游戏包?).
下面是程序的简单布局:
程序结构:
1 2 3 4 | __main__.py game/ __init__.py game.py |
P.
1 2 3 4 5 6 7 8 9 10 11 12 13 | import game def main(): g = game.Game() try: g.start() except game.StopGame: print ' bye bye!' if __name__ == '__main__': main() |
游戏/初始版本
1 2 | from game import Game from game import StopGame |
游戏/游戏
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | class Game: def start(self): try: a = raw_input('do you want to play? ') print 'cool' except (KeyboardInterrupt, EOFError): raise StopGame if a == 'no': raise StopGame else: print 'cool' class StopGame(Exception): pass |
这个代码可以这样工作,我只是不确定这是怎么回事。我发现有点令人失望的是,我应该使用这个设置导入game/u init_uy中的每个异常。否则,我应该抓住例外,比如:
1 | except game.game.StopGame |
看起来有点恶心。我认为最好能从变量"game"中找到模块"game"中的所有属性。然后我知道你可以把这个放在游戏里。
1 | from game import * |
这将从game/game.py导入所有类,但我听说使用*导入是一种糟糕的做法。
所以,我的问题是,最好的方法是什么?也许我的整个设置是错误的,如果是这样,我想听听什么是正确的设置。
提前多谢!
顺便问一下:如果你想知道为什么我在一个游戏包里有一个游戏模块:这个包会包含更多的与游戏相关的模块,game/game.py只是整个游戏的发起者,也许我应该把这个代码放进game/u initpy?
其他地方怎么办?
我认为解决问题的最佳方法是查看实际的Python包,并了解它是如何构建的。我将以优秀的python requests包为例。
这个模块是关于发出HTTP请求的。你的是玩游戏。
基本HTTP请求功能在
异常在
最后,不使用
- 避免使用
game/game.py 文件,称之为game/core.py 或其他 - 对于一个小的包,将您的异常放在一个
game/exceptions.py 文件中。 - 在
game/__init__.py 中,从包中导入通常需要的内容:主要类和异常。