2017-05-26 2 views
0

Ich lerne, wie benutzerdefinierte Ausnahme in Python erstellenBenutzerdefinierte Ausnahme - Python

import sqlite3 

class MyError(Exception): 
    def __init__(self, value): 
    self.value = value 
try:   
    conn= sqlite34.connect('database56.sqlite') 
    print conn 
    print 'connection established' 
except MyError as e: 
    print 'Error message:', e.value 

Wenn ich das obige Programm ausführen, ich den Namen Fehler Nameerror erhalten: name ‚sqlite13‘ definiert ist, nicht

Wie rufe ich die benutzerdefinierte Ausnahme auf, wenn eine Verbindung zur Datenbank fehlschlägt? Wenn [außer MyError als e:] durch [außer:] ersetzt wird, wird der Ausnahmeblock weiterhin nicht aufgerufen. Danke für Ihre Hilfe.

+0

Der Code hier sagt nichts über sqlite13, nur sqlite34, also der Fehler Ihre Referenzierung bezieht sich nicht auf den Code, den Sie gepostet haben. –

+0

Sind Sie sich über diesen letzten Anspruch sicher? Wenn Sie im obigen Code ein nacktes 'except:' verwenden, wird der 'NameError' abgefangen. – tdelaney

+0

plain außer: bearbeitet..danke – Lotus

Antwort

3

eine Ausnahme definiert nicht ändert, welche Ausnahmen von anderen Modulen erhöht werden. Wenn Sie möchten, dass Ihr Code Ihre Exception verwendet, müssen Sie herausfinden, was das andere Modul räsoniert, und dann Ihr eigenes Modul erneut erstellen.

import sqlite3 

class MyError(Exception): 
    def __init__(self, value): 
    self.value = value 
try:   
    conn= sqlite3.connect('database56.sqlite') 
    print conn 
    print 'connection established' 
except sqlite3.Error as e: 
    print 'Error message:', e.value 
    raise MyError('Could not connect to db: ' + e.value) 

Ich habe die allgemeinen sqlite3 Fehler hier gefangen, aber Sie können weitere Ausnahmen hinzufügen müssen, wenn sie auch durch das Modul erhöht werden. Was genau diese Ausnahmen sind, ist in Python nicht einfach herauszufinden. Sie können die Quelle lesen, experimentieren oder sich im Internet nach Beispielen umsehen.

+0

vielen Dank – Lotus

1

Ich denke, das ist ein XY Problem.

In diesem Fall möchten Sie einen NameError abfangen, daher sollten Sie diesen direkt in der Anweisung "except" verwenden. Wenn Sie nach dem Abfangen des Fehlers Aktionen ausführen möchten, sollten Sie diese Aktionen in die Anweisung "except" einfügen. Einige Dokumentationen finden Sie unter here. Beispiel:

except NameError as e: 
    print 'Error message:', e.value 
    print 'Splite module not loaded' 

Benutzerdefinierte Fehler sind beispielsweise nützlich bei falsch/unerwarteten Parameter oder Ausgang. Daher sind benutzerdefinierte Fehler nützlich, da Sie die Situationen bestimmen, in denen sie ausgelöst werden, was nicht unbedingt eine Situation ist, in der "Python abstürzen würde".

Here einige Dokumentation darüber.

Vielleicht kann ein Beispiel zur Klärung beitragen.

Angenommen, Sie haben eine Funktion, wenn eine der Variablen der Preis von etwas ist. Dann könnten Sie tun:

class NegativePriceException(Exception): 

    def __init__(self): 
     print "Price can't be negative!" 
     raise AttributeError 

def calc_price(...): 
    price = ... #some calculation 
    if price < 0: 
     raise NegativePriceException 
    return price 
+0

Danke..got it – Lotus