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

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请求功能在requests/__init__.py文件中导入,但在其他地方定义。这就是你要做的,但"其他地方"可能有更好的名字。也许game/core.py是个很好的选择。

异常在requests/exceptions.py文件中定义。对于一个相对较小的包来说,将所有异常都放在一个地方通常是合适的。请注意,例外情况也会导入到requests/__init__.py!这使得它们更容易导入到可能需要捕获它们的其他包中!

最后,不使用from module import *。实际添加所需内容不会花费太多时间,因此应避免使用*

你能做些什么?

  • 避免使用game/game.py文件,称之为game/core.py或其他
  • 对于一个小的包,将您的异常放在一个game/exceptions.py文件中。
  • game/__init__.py中,从包中导入通常需要的内容:主要类和异常。