Python用户定义的异常放置和捕获

Python用户定义的异常放置和捕获,python,exception-handling,Python,Exception Handling,我是Python新手,不确定将用户定义的异常放在什么地方以及在哪里捕获它们 例如,我有一个启动游戏的程序,当游戏停止时,会引发一个用户定义的异常(StopGame)。我应该从游戏外部捕获此异常,因为游戏正在抛出此异常。但是,异常是特定于游戏的,因此异常的定义应该在游戏模块(或者可能是游戏包?)中 以下是程序的简单布局: 程序结构: __main__.py game/ __init__.py game.py \uuuu main\uuuuu.py import game def

我是Python新手,不确定将用户定义的异常放在什么地方以及在哪里捕获它们

例如,我有一个启动游戏的程序,当游戏停止时,会引发一个用户定义的异常(StopGame)。我应该从游戏外部捕获此异常,因为游戏正在抛出此异常。但是,异常是特定于游戏的,因此异常的定义应该在游戏模块(或者可能是游戏包?)中

以下是程序的简单布局:

程序结构

__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听起来是个好主意,谢谢!