簡體   English   中英

在python中編寫庫時如何處理異常

[英]how to handle exceptions while writing a library in python

考慮用 python 編寫一個小庫,它有一個簡單的方法x ,它接受一個參數ac並返回計算值10/ac 現在這里的問題是ac不能是0 那么我如何在我的方法中處理這種情況。我想到了這些方法。

注意:我已經研究了 python 異常處理,但它只是展示了如何使用try except我要問的特定問題try except

方法一

def x(ac):
    try:
        return (10/ac)
    except  ZeroDivisionError:
        raise ZeroDivisionError("ac cannot be zero")

上面的代碼只是使用一個普通的 try except 塊來捕獲特定的異常並將異常引發給調用代碼。 所以調用代碼看起來像這樣:

# some script...
try:
    x(0)
except ZeroDivisionError as e:
    log(e)

但在這種情況下,我必須事先知道方法x可能引發的所有可能的異常。

方法二:

def x(ac):
    if ac == 0:
        raise ValueError("ac cannot be zero") # or ZeroDivisionError??
    else:
        return (10/ac)

我想這在語義上與前一個相同,除了使用if's和基於此引發異常來檢查某些條件(我們知道可能會發生)。 它還面臨着同樣的問題,即事先知道該方法可能拋出哪些異常。

方法三

最后一種方法不是處理庫方法中的任何異常,而是將其留給客戶端代碼,但這顯然沒有意義,因為客戶端永遠無法知道為什么在求助於類似的東西時可能會發生錯誤

def x(ac):
    return (10/ac)


    try:
       x(20)
    except Exception as e:
       log(e)

現在這里的這個方法是一個簡單的方法,只有一個操作,但是如果方法本身正在做一些復雜的事情,比如連接到數據庫然后獲取一些結果怎么辦。 就像是 :

def x(db):
    conn = db.connect('localhost')
    results = connec.fetch(user_id=2)
    return results

如果有什么不清楚,請告訴我。

這取決於 TypeErrorValueErrorTypeError是標准的,通常表示編程錯誤。 通常不需要明確說明這些。

其余的,您記錄. 作為 API 作者,您有責任明確其他開發人員可以從您的代碼中獲得哪些行為。 如果ZeroDivisionError是一個很好的記錄信號,則將其添加到 API 的文檔字符串中。 在這一點上,也不需要明確地捕獲並再次提出它。 不要指望用戶閱讀你的代碼,而是給他們好的文檔。

對於許多 API 來說,定義自己的異常是有意義的。 該實現可以捕獲通用異常,或者它用來完成工作的第 3 方 API 的自定義異常,然后引發特定於 API 的異常以向調用者發出錯誤信號,讓他們處理問題。

有很多流行的 Python 庫的例子有這樣的例外。 一些例子:

這些項目的共同點是良好的文檔,明確命名了使用該項目的任何人都應該注意的例外情況。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM