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

git*_*rik 5 python exception-handling

我是Python的新手,我不确定放置用户定义的异常的最佳位置是什么,以及在哪里捕获它们.

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

这是程序的简单布局:

计划结构:

__main__.py
game/
    __init__.py
    game.py
Run Code Online (Sandbox Code Playgroud)

_ _main_ _ .py

import game

def main():
    g = game.Game()

    try:
        g.start()
    except game.StopGame:
        print '\nbye bye!'

if __name__ == '__main__':
    main()
Run Code Online (Sandbox Code Playgroud)

game/_ _init_ _ .py

from game import Game
from game import StopGame
Run Code Online (Sandbox Code Playgroud)

游戏/ 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
Run Code Online (Sandbox Code Playgroud)

这段代码工作正常,我只是不确定这是要走的路.我觉得有点令人失望的是我应该使用这个设置导入game/_ init _ .py中的每个异常.否则我应该抓住例外:

except game.game.StopGame
Run Code Online (Sandbox Code Playgroud)

这看起来有点讨厌.我认为最好能够从_ main _ .py中的变量'game'到达模块'游戏'中的所有属性.然后我知道你可以把它放在game/_ init _ .py中:

from game import *
Run Code Online (Sandbox Code Playgroud)

这将导入game/game.py中的所有类,但我听说使用*进行导入是一种不好的做法.

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

非常感谢提前!

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

Tho*_*zco 5

怎么在其他地方完成?

我认为解决问题的最佳方法是查看实际的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,导入包中通常需要的东西:主类和异常.