2016-08-09 8 views
2

例外をスローすることは、ユーザーが別のプログラマーである場合にユーザーに何かを伝える最良の方法であるのだろうかと思います。Python:この例では正しいユースケースを例外として投げていますか?

私はテキストベースのゲームを作成するための小さなライブラリを開発しています(Dwarf Fortressと思うが、非常に簡単です)。もちろん、私はものが地図の中で動くようにしたい。それはとてもシンプルで、docstringは非常に完成しているので、うまく読むはずです。

def move(self, tile): 
    """Move the object to a tile. 
    That means: unlink the piece from its current tile and link it 
    to the new tile. 

    Raise CharacterIsNotOnATileError if piece didn't already 
    have an associated tile, CharacterIsNotOnThisBoardError if 
    the destinity tile is not on the same board as the current tile, 
    OutOfBoard error if destinity tile is falsey (most probably 
    this means you're tring to move somewhere outside the map) 
    """ 
    if tile.piece is not None: 
     raise PositionOccupiedError(tile) 
    if not self.home_tile: 
     raise PieceIsNotOnATileError 
    if self.home_tile.board is not tile.board: 
     raise PieceIsNotOnThisBoardError 
    if not tile: 
     raise OutOfBoardError 

    self.home_tile.piece = None 
    tile.piece = self 

この構造は悪いですか?私はそれがうまく読み込んだと思う:ユーザーが自分の作品を移動しようとしたとき、彼が行うことができます。

try: 
    character.move(somewhere) 
except PositionOcuppiedError: 
    character.punish # cause i'm in hardcore 
except OutOfBoardError: 
    character.kill # cause we were in a floating world and the 
        # character just fell off 

いくつかのより多くのロジックがコードはなく、何かをするをしようと、このように実装ライブラリーにありますできない場合は例外がスローされます。これでいい?あるいは、エラーコード(整数など)を返す必要があります。

答えて

3

この使用例は例外としてすべて正しいと思われます。

「例外は例外的であるべき」

が、Pythonで、フロー制御を実行するために、例外の使用は悪い習慣("Is it a good practice to use try except else in python"続きを読む)とはみなされない:一部の人々はと言います。

さらに、繰り返し呼び出される関数に置かれた場合、Pythonで例外をスローしてチェックするとパフォーマンスに悪影響を与える可能性があることに注意してください。何百人ものプレーヤーがいるペースが速いゲームを開発しているのでなければ、それはあなたの主な関心事ではありません。キャッチする例外のパフォーマンスに関連する問題の詳細については、in this topic on Stack Overflowを参照してください。

個人的には、私はプログラマーとして、エラーコードやそれに類するものよりも(Pythonでプログラミングするときの)例外を扱うことにします。一方、エラーコードとして指定されている場合、返されるステータスの幅広い範囲を処理することはそれほど難しくありません。たとえば、switch-case構造を模倣することができます。 dictionary with callable handlers as values

+0

非常に面白い読み込み。どうもありがとうございました! – joaquinlpereyra

2

私の意見では、例外をスローすると、エラーが発生したことを通知するより良い方法です。特に、関数が値を返さない場合。それぞれの呼び出しの後に開発者が戻り値の型をチェックしなければならないと想像してください。はるかに明確です。 チェックthis

+0

"各呼び出し後に開発者が戻り値の型をチェックする必要があると想像してください。"これが当てはまる言語はたくさんあります。あなたが考えるほど厄介ではありません。 [例外的なものよりも優れていると主張する者もいるだろう。](http://www.joelonsoftware.com/items/2003/10/13.html) –

+0

@ VincentSavardが主張しているように、これは簡単な答えではない。リンクされている記事は面白いですが、C++/Javaを多く参照しています。私は、Pythonはこれらのことでもっと弛緩していると思っていますが、もう一度私は尋ねています。 – joaquinlpereyra

+0

例外を発生させることは、Pythonで有効なフロー制御だと私は考えています。たとえば、独自の反復可能オブジェクトを実装する場合は、 'StopIteration'例外を送出して範囲の終わりを示します。 – shwoop

関連する問題