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



我是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()

game/ _ _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

此代码像这样工作正常,我不确定这是必经之路。我发现有些令人失望的是,我应该在游戏/ _ init _ .py中导入所有例外。否则我应该捕获以下例外,例如:

except game.game.StopGame

看起来有点讨厌。我认为最好能够从 _ main _ _ .py中的变量'game'中的模块"游戏"中的所有属性。然后我知道您可以将其放入游戏/ _ init _ .py:

from game import *

它将从game/game.py导入所有类,但我听说使用 *用于导入是一种不好的做法。

那么,我的问题是,这样做的最好方法是什么?也许我的整个设置是错误的,如果是的话,我想听听正确的设置。

预先感谢!

btw:如果您可能想知道为什么我在游戏包中有一个游戏模块:想法是该软件包将包含许多与游戏相关的模块,game/game.py只是整个游戏,也许我应该将该代码放入游戏/ _ init _ .py?

在其他地方如何完成?

我认为回答您的问题的最佳方法是查看实际的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中,导入您的软件包通常需要的内容:主要类和例外。

最新更新