2017-05-26 52 views
0

我正在學習如何在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 

當我運行上面的程序,我得到的名稱錯誤 NameError:名字「sqlite13」沒有定義

如果無法連接到數據庫,我該如何調用用戶定義的異常?當[除了MyError as e:]被[except:]替換時,仍然不調用異常塊。 感謝您的幫助。

+0

這裏的代碼沒有說關於sqlite13,只有sqlite34,所以你引用的錯誤不是參考你發佈的代碼。 –

+0

你確定最後的說法嗎?如果你在上面的代碼中使用裸體'except:',它會捕獲'NameError'。 – tdelaney

+0

平原除外:工作..謝謝 – Lotus

回答

3

定義異常不改變其他模塊引發什麼異常。如果你想要你的代碼使用你的異常,你必須捕捉其他模塊rasies,然後重新提出自己的。

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) 

我在這裏抓住了通用sqlite3的錯誤,但你可能需要添加其他異常,如果他們也通過模塊提高。這些例外的東西在python中並不容易理解。你可以閱讀源代碼,試驗或環顧網上的例子。

+0

非常感謝你 – Lotus

1

我認爲這是一個XY Problem

在這種情況下,您想捕獲一個NameError,所以您應該直接在except語句中使用它。如果要在捕獲錯誤後執行操作,則應將該操作放入except語句中。有些文檔可以在here找到。 實施例:

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

用戶定義的錯誤是例如與錯誤/非預期的參數或輸出是有用的。所以用戶定義的錯誤是有用的,因爲你確定了它們被引發時的情況,這不一定是「python會崩潰」的情況。

Here關於它的一些文檔。

也許一個例子可以幫助澄清。

假設你有一個函數,當其中一個變量是價格的東西。 那麼你可以做:

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

謝謝你..談它 – Lotus