2016-07-27 18 views
0

Ich habe ein Datenbankverbindungsobjekt, und ich möchte die maximale Anzahl von Aufrufen auf seine Schreiboperation (Funktion) beschränken/erzwingen. Ich habe es in Tests verspottet und die Schreibmethode überschrieben, um Aufrufe daran zu überwachen.Welche Ausnahmeklasse ist am besten geeignet, um eine überzählige Anzahl von Aufrufen einer Funktion zu kennzeichnen?

Allerdings bin ich verwirrt darüber, welchen Fehler zu erhöhen, wenn es mehr als die maximal zulässige Zahl (etwa 2) aufgerufen wird. Ich bin durch die docs gegangen, habe aber nichts passendes gefunden. (Also, wie es suggeriert) Ich habe RuntimeError verwendet, aber ich bin nicht völlig überzeugt von der Nachricht, die es gibt (nicht die explizite Nachricht, die ich zeige, sondern die implizite Bedeutung, die von der Klasse selbst vermittelt wird). Ich fühle, dass AttributeError weit passt, aber nichts anderes kommt der Genauigkeit so nahe.

Gibt es eine andere eingebaute Ausnahmeklasse, die dafür besser geeignet ist?

+0

Ich würde eine benutzerdefinierte Ausnahme erstellen ... Ich bin mir nicht ganz sicher, warum Sie eine eingebaute möchten. – SuperSaiyan

+0

@SuperSaiyan Ja, das ist meine letzte Zuflucht, eine ziemlich gewöhnliche auch. Ich hätte diese Zeile zu der Frage hinzufügen sollen, verpasste es :). – 0xc0de

+0

@ 0xc0de: Warum möchten Sie die Anzahl der Anrufe zählen? Möchten Sie diesen Code bei der Produktion ausführen? Weil Sie die Anzahl der Aufrufe auf eine Methode begrenzen, die immer eine Ausnahme nach ** MAX ** Anzahl von Anrufen auslöst. Diese Methode wird niemals geöffnet, bis Sie die Umgebung erneut starten. –

Antwort

0

Wenn Sie zu viele Argumente für eine Funktion liefern Ihnen etwas wie folgt aus:

TypeError: function-name takes exactly n arguments (m given) 

So könnte man das gleiche tun Python zu spiegeln. Sie sollten wahrscheinlich vorsichtig sein, wenn Sie raise aufrufen, um sicherzustellen, dass Ihre Ausnahmekette von einer von Python erzeugten unterschieden werden kann, sonst könnten Sie eine echte TypeError maskieren.

Die Meinung dazu ist geteilt. Einige sagen, dass benutzerdefinierte Ausnahmeklassen nicht erforderlich sind. Persönlich denke ich, dass es einen Platz für sie gibt, wenn es Verwirrung geben könnte. ganz einfach Ihre eigene Exception zu schaffen, ist alles, was Sie brauchen, ist:

class MyException(TypeError): 
    pass 

Jetzt wissen Sie, dass alle Ereignisse aus dem Code kommen, nicht aus Python. Denken Sie daran, wenn Sie dies in ein Modul oder eine Klasse einfügen, um dem Namespace, z. MyClass.MyException.