Python用户定义的异常放置和捕获
我是Python新手,不确定将用户定义的异常放在什么地方以及在哪里捕获它们 例如,我有一个启动游戏的程序,当游戏停止时,会引发一个用户定义的异常(StopGame)。我应该从游戏外部捕获此异常,因为游戏正在抛出此异常。但是,异常是特定于游戏的,因此异常的定义应该在游戏模块(或者可能是游戏包?)中 以下是程序的简单布局: 程序结构:Python用户定义的异常放置和捕获,python,exception-handling,Python,Exception Handling,我是Python新手,不确定将用户定义的异常放在什么地方以及在哪里捕获它们 例如,我有一个启动游戏的程序,当游戏停止时,会引发一个用户定义的异常(StopGame)。我应该从游戏外部捕获此异常,因为游戏正在抛出此异常。但是,异常是特定于游戏的,因此异常的定义应该在游戏模块(或者可能是游戏包?)中 以下是程序的简单布局: 程序结构: __main__.py game/ __init__.py game.py \uuuu main\uuuuu.py import game def
__main__.py
game/
__init__.py
game.py
\uuuu main\uuuuu.py
import game
def main():
g = game.Game()
try:
g.start()
except game.StopGame:
print '\nbye bye!'
if __name__ == '__main__':
main()
from game import Game
from game import StopGame
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/\uuuu init\uuuuu.py
import game
def main():
g = game.Game()
try:
g.start()
except game.StopGame:
print '\nbye bye!'
if __name__ == '__main__':
main()
from game import Game
from game import StopGame
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/game.py
import game
def main():
g = game.Game()
try:
g.start()
except game.StopGame:
print '\nbye bye!'
if __name__ == '__main__':
main()
from game import Game
from game import StopGame
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/\u init..py中的所有异常。否则,我将捕获异常,如:
except game.game.StopGame
看起来有点恶心。我认为最好能够从\u main\uu.py中的变量“game”访问模块“game”中的所有属性。然后我知道你可以把它放在游戏里
from game import *
这将从game/game.py导入所有类,但我听说使用*进行导入是一种糟糕的做法
所以,我的问题是,最好的方法是什么?也许我的整个设置是错误的,如果是这样,我想听听什么是正确的设置
提前多谢
顺便说一句:如果你可能想知道为什么我在一个游戏包中有一个游戏模块:这个想法是,这个包将包含更多与游戏相关的模块,game/game.py只是整个游戏的发起人,也许我应该把代码放进game/\u init..py?其他地方是怎么做的?
我认为解决您的问题的最佳方法是查看实际的Python包,并了解它是如何构建的。我将以这个例子
本模块是关于发出HTTP请求的。你的是关于玩游戏的
基本HTTP请求功能在requests/\uuuu init\uuuu.py
文件中导入,但在其他地方定义。这就是你正在做的,但是“别处”可以有一个更好的名字。也许game/core.py
很适合
异常在请求/Exceptions.py
文件中定义。对于一个相对较小的包来说,将所有异常放在一个地方通常是合适的。请注意,异常也会导入到
请求/\uuuu init\uuuu.py
中!这使它们更容易导入到可能需要捕获它们的其他包中
最后,不使用模块导入中的*
。实际添加所需内容不会花费太多时间,因此您应该避免*
在你的情况下你能做什么?
- 避免使用
文件,将其称为game/game.py
或其他文件game/core.py
- 对于小程序包,请将异常放入
文件中game/exceptions.py
- 在
中,从包中导入通常需要的内容:主类和异常game/\uuuu init\uuuu.py
停止游戏
应该是错误吗?否则我应该如何停止游戏?我可以让Game()返回false或其他东西,但是我应该在Game()的每一个更深层建立这个返回机制,在那里游戏可能会被停止。@Blender考虑到SystemExit
是一个例外,我认为StopGame
也是一个有意义的返回机制。谢谢,伙计,这真的让事情变得更清楚了!使用一个单独的模块将所有异常放入其中看起来是个好主意。我还将详细介绍requests包。另外,将建议重命名为core听起来是个好主意,谢谢!