2012-11-01 29 views
5

Tôi mới sử dụng Python và tôi không chắc chắn nơi tốt nhất để đặt ngoại lệ do người dùng xác định là gì và nơi bắt chúng.Vị trí ngoại lệ do người dùng xác định bằng Python và bắt

Ví dụ: tôi có một chương trình khởi động trò chơi, khi trò chơi bị dừng, ngoại lệ do người dùng xác định được tăng lên (StopGame). Tôi nên bắt ngoại lệ này từ bên ngoài trò chơi vì trò chơi đang ném ngoại lệ này. Mặc dù, ngoại lệ là đặc trưng cho trò chơi nên định nghĩa ngoại lệ phải ở trong mô-đun trò chơi (hoặc có thể là gói trò chơi?).

Dưới đây là cách bố trí đơn giản của chương trình:

cấu trúc Chương trình:

__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() 

trò chơi/_ _init_ _ py

from game import Game 
from game import StopGame 

trò chơi/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 

Mã này hoạt động tốt như thế này, tôi chỉ không chắc chắn đây là con đường để đi. Điều tôi thấy hơi thất vọng là tôi nên nhập mọi ngoại lệ trong trò chơi/_ init _ .py bằng cách sử dụng thiết lập này. Nếu không, tôi nên bắt ngoại lệ như:

except game.game.StopGame 

Có vẻ hơi khó chịu. Tôi nghĩ tốt hơn là có thể tiếp cận tất cả các thuộc tính trong mô-đun 'trò chơi' từ biến 'trò chơi' trong _ chính _ .py. Sau đó, tôi biết bạn có thể đặt điều này trong trò chơi/_ init _ py:

from game import * 

nào sẽ nhập khẩu tất cả các lớp từ trò chơi/game.py, nhưng tôi nghe nói rằng việc sử dụng * cho nhập khẩu là một xấu thực hành.

Vì vậy, câu hỏi của tôi là, cách tốt nhất để làm điều này là gì? Có lẽ toàn bộ thiết lập của tôi là sai, nếu có, tôi muốn nghe thiết lập chính xác là gì.

Cảm ơn rất nhiều trước!

BTW: Nếu bạn có thể thắc mắc tại sao tôi có mô-đun trò chơi bên trong gói trò chơi: ý tưởng là gói sẽ chứa nhiều mô-đun hơn có liên quan đến trò chơi, game/game.py chỉ là người khởi xướng của toàn bộ trò chơi, có lẽ tôi nên đặt mã đó vào trò chơi/_ init _ .py?

+0

Bạn có nghĩ rằng 'StopGame' phải là lỗi không? – Blender

+0

Tôi nên dừng trò chơi bằng cách nào? Tôi có thể để Game() trả về false hoặc một cái gì đó, nhưng sau đó tôi nên xây dựng cơ chế trả về này trong mỗi tầng sâu hơn từ Game(), nơi trò chơi có thể muốn được dừng lại. – rednaw

+0

@Blender Xem xét 'SystemExit' là một ngoại lệ, tôi nghĩ rằng 'StopGame' là một điều quá hợp lý. –

Trả lời

5

Làm cách nào để thực hiện ở nơi khác?

Tôi nghĩ rằng cách tốt nhất để trả lời vấn đề của bạn là xem xét gói Python thực tế và xem cách nó được tạo. Tôi sẽ lấy ví dụ về số excellent python-requests package.

Mô-đun này giới thiệu về yêu cầu HTTP. Của bạn là về chơi một trò chơi.

Chức năng yêu cầu HTTP cơ bản được nhập trong tệp requests/__init__.py nhưng được xác định ở nơi khác. Đó là những gì bạn đang làm, nhưng 'ở nơi khác' có thể có tên tốt hơn. Có lẽ game/core.py có thể phù hợp.

Ngoại lệ được xác định trong tệp requests/exceptions.py. Nó thường thích hợp cho một gói tương đối nhỏ để có tất cả các trường hợp ngoại lệ ở một nơi.
Lưu ý rằng ngoại lệ cũng được nhập vào requests/__init__.py! Điều này làm cho chúng dễ dàng hơn để nhập vào các gói khác có thể cần phải nắm bắt chúng!

Cuối cùng, không sử dụng from module import *. Nó sẽ không mất quá nhiều thời gian để thực sự thêm chính xác những gì cần thiết, vì vậy bạn nên tránh *.


Bạn có thể làm gì trong trường hợp của mình?

  • Tránh việc có một tập tin game/game.py, gọi nó là game/core.py hoặc một cái gì đó
  • Đối với một gói nhỏ, đặt trường hợp ngoại lệ của bạn trong một tập tin game/exceptions.py
  • Trong game/__init__.py, nhập khẩu những gì thường cần từ gói của bạn: các lớp học chính và các ngoại lệ.
+0

Cảm ơn người đàn ông, điều đó thực sự xóa mọi thứ! Sử dụng một mô-đun riêng biệt để đặt tất cả các ngoại lệ giống như một ý tưởng hay. Tôi cũng sẽ xem xét kỹ lưỡng gói yêu cầu. Ngoài ra đề xuất đổi tên thành âm thanh cốt lõi như một ý tưởng hay, cảm ơn bạn! – rednaw

Các vấn đề liên quan