【发布时间】:2012-11-01 18:38:03
【问题描述】:
我是 Python 新手,我不确定放置用户定义异常的最佳位置是什么,以及在哪里捕获它们。
例如,我有一个启动游戏的程序,当游戏停止时,会引发用户定义的异常(StopGame)。我应该从游戏外部捕获这个异常,因为游戏正在抛出这个异常。不过,异常是特定于游戏的,所以异常的定义应该在游戏模块(或者可能是游戏包?)中。
这是程序的简单布局:
程序结构:
__main__.py
game/
__init__.py
game.py
__main__.py
import game
def main():
g = game.Game()
try:
g.start()
except game.StopGame:
print '\nbye bye!'
if __name__ == '__main__':
main()
游戏/__init__.py
from game import Game
from game import StopGame
game/game.py
class Game:
def start(self):
try:
a = raw_input('do you want to play?\n')
print 'cool'
except (KeyboardInterrupt, EOFError):
raise StopGame
if a == 'no':
raise StopGame
else:
print 'cool'
class StopGame(Exception):
pass
这段代码像这样工作得很好,我只是不确定这是要走的路。令我有些失望的是,我应该使用此设置导入 game/_init_.py 中的每个异常。否则我应该捕捉到这样的异常:
except game.game.StopGame
这看起来有点讨厌。我认为最好能够从 _main_.py 中的变量 'game' 中访问模块 'game' 中的所有属性。然后我知道你可以把它放到 game/_init_.py:
from game import *
这将从game/game.py导入所有类,但我听说使用*进行导入是一种不好的做法。
那么,我的问题是,最好的方法是什么?也许我的整个设置是错误的,如果是这样,我想听听正确的设置是什么。
提前非常感谢!
顺便说一句:如果您可能想知道为什么我在游戏包中包含一个游戏模块:这个想法是该包将包含更多与游戏相关的模块,game/game.py 只是整个游戏,也许我应该将该代码放入游戏/_init_.py?
【问题讨论】:
-
你认为
StopGame应该是一个错误吗? -
否则我应该如何停止游戏?我可以让 Game() 返回 false 或其他东西,但是我应该在 Game() 中希望停止游戏的每个更深的层中建立这个返回机制。
-
@Blender 考虑到
SystemExit是一个例外,我认为StopGame也是一个例外。