2016-08-09 95 views
2

Ich frage mich, ob das Auslösen von Ausnahmen der beste Weg ist, dem Benutzer etwas mitzuteilen, falls der Benutzer ein anderer Programmierer ist.Python: wirft eine Ausnahme einen korrekten Anwendungsfall in diesem Beispiel?

Ich entwickle eine kleine Bibliothek, um Text-basierte Spiele zu erstellen (denke Dwarf Fortress, aber extrem einfacher). Natürlich möchte ich, dass sich Sachen innerhalb der Karte bewegen. Es ist sehr einfach und der Docstring ist sehr vollständig, so sollte es gut lesen.

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 

Ist diese Struktur schlecht? Ich denke, es liest schön: wenn der Benutzer ein Stück seiner eigenen zu bewegen versucht, kann er tun:

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 

Es gibt einige weitere Logik in der wie folgt umgesetzt: Bibliothek, wo der Code etwas zu tun versucht, aber Wenn dies nicht möglich ist, wird eine Ausnahme ausgelöst. Ist das ok? Oder vielleicht sollte ich Fehlercodes (als Integer zum Beispiel) zurückgeben.

Antwort

3

Dieser Anwendungsfall scheint für Ausnahmen in Ordnung zu sein. Manche Leute sagen, dass:

„Ausnahmen Ausnahme sein sollte“

aber in Python, die Verwendung von Ausnahmen Flusssteuerung auszuführen nicht als schlechte Praxis betrachtet wird (lesen Sie mehr "Is it a good practice to use try except else in python").

Beachten Sie außerdem, dass das Auslösen und Überprüfen von Ausnahmen in Python negative Auswirkungen auf die Leistung haben kann, wenn sie in wiederholt aufgerufenen Funktionen platziert werden. Wenn Sie kein rasantes Spiel mit Hunderten von Spielern entwickeln, sollte dies nicht Ihre Hauptsorge sein. Sie können mehr über leistungsbezogene Probleme beim Abfangen von Ausnahmen lesen in this topic on Stack Overflow.

Persönlich, als Programmierer würde ich lieber mit Ausnahmen umgehen (bei der Programmierung in Python) als mit Fehlercodes oder etwas ähnliches. Auf der anderen Seite ist es nicht viel schwieriger, einen großen Bereich von zurückgegebenen Status zu behandeln, wenn sie als Fehlercodes gegeben werden - Sie können immer noch das Schaltfall-Konstrukt imitieren, indem z. dictionary with callable handlers as values.

+0

Sehr interessant liest. Vielen Dank! – joaquinlpereyra

2

Meiner Meinung nach werfen Ausnahmen die bessere Möglichkeit zu informieren, dass ein Fehler aufgetreten ist. Vor allem, wenn Ihre Funktion keinen Wert zurückgibt. Stellen Sie sich vor, dass Entwickler nach jedem Aufruf den Typ des zurückgegebenen Wertes überprüfen müssen. Es ist viel klarer. Überprüfen Sie this.

+0

"Stellen Sie sich vor, der Entwickler muss nach jedem Aufruf den Typ des zurückgegebenen Wertes überprüfen." Es gibt viele Sprachen, in denen dies der Fall ist, und es ist nicht annähernd so schwierig wie Sie denken. [Einige würden argumentieren, dass es sogar besser als Ausnahmen ist.] (Http://www.joelonsoftware.com/items/2003/10/13.html) –

+0

Wie @VincentSavard argumentiert, ist dies keine so einfache Antwort. Der verlinkte Artikel ist interessant, bezieht sich aber sehr auf C++/Java. Ich denke, Python ist viel laxer mit diesen Dingen, aber andererseits bin ich der Fragesteller. – joaquinlpereyra

+0

Ich glaube, das Auslösen von Ausnahmen ist eine gültige Ablaufsteuerung in Python. Wenn Sie beispielsweise ein eigenes iterierbares Objekt implementieren, geben Sie das Ende des Bereichs an, indem Sie eine Ausnahme "StopIteration" auslösen. – shwoop