2012-11-01 48 views
5

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

遊戲/ _ _init_ _的.py

from game import Game 
from game import StopGame 

遊戲/ 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 

這看起來有點討厭。我認爲最好能夠通過__.py來從變量'遊戲'中達到模塊'遊戲'中的所有屬性。然後,我知道你可以把這個遊戲/ _ 初始化 _的.py:

from game import * 

這將導入所有的類都是從遊戲/ game.py,但我聽說,使用*導入是一個壞實踐。

所以,我的問題是,這樣做的最好方法是什麼?也許我的整個設置是錯誤的,如果是這樣,我想聽聽什麼是正確的設置。

非常感謝!

順便說一句:如果你想知道爲什麼我在遊戲包中有一個遊戲模塊:這個想法是,包中會包含更多與遊戲相關的模塊,遊戲/遊戲.py就是發起者可能我應該將該代碼放入遊戲中/ _ init _ .py?

+0

您是否認爲'StopGame'應該是錯誤的? – Blender

+0

我應該如何停止遊戲?我可以讓Game()返回false或者其他東西,但是我應該在Game()的每一個更深的層次中構建這個返回機制,這個遊戲可能希望被停止。 – rednaw

+0

@Blender考慮到'SystemExit'是一個例外,我認爲'StopGame'也是有道理的。 –

回答

5

它在別處怎麼做?

我認爲解決問題的最佳方法是查看實際的Python包並查看它的構建方式。我將以excellent python-requests package爲例。

該模塊是關於製作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,進口什麼,通常從你的包需要:主類和例外。
+0

謝謝你,真的清除了一切!使用單獨的模塊來放置所有異常看起來是一個好主意。我還會詳細看看請求包。核心的重命名建議聽起來像一個好主意,謝謝! – rednaw