Python 中的斷言與異常該怎麼選擇?

2021-08-22 10:24:35 字數 1447 閱讀 7943

異常,在程式執行時出現非正常情況時會被丟擲,比如常見的名稱錯誤、鍵錯誤等。

斷言,判斷某個表示式的真假,真則程式繼續執行,否則丟擲 assertionerror 異常。

理解這兩個概念不難,但是什麼時候使用誰卻讓很多開發者難以選擇。本文呢,我會舉一些例子,說明使用斷言或異常的合適場景,並作小結。當然,只是個人經驗,有不合理的地方也請指出。

什麼時候使用斷言

你可以使用斷言去檢查**中的確定量。確定量怎麼理解?在當前情境下,確定量總會滿足特定條件。比如,在某段**裡,變數 x 的值始終應該在 0 到 1 之間。

斷言能夠幫助別人或未來的你理解**,找出程式中邏輯不對的地方。一方面,斷言會提醒你某個物件應該處於何種狀態,另一方面,如果某個時候斷言為假,會丟擲 assertionerror 異常,很有可能終止程式。

下面是一些斷言有用的地方

例一例二

比如你在網上填調查問卷時,乙個單選題,往往有個自定義選項,當你選擇該項時,需要自己填寫相應的內容。

例三引數校驗

有的時候斷言會被用到函式引數校驗的地方,我們應該避免這種使用方式。因為,如果 python 以 -o 選項執行的話,assert 語句會被跳過。這樣的話,我們的校驗語句都會失效。

斷言為假觸發的異常的語義相比於一般的異常也不太明確。比如,當需要使用 int 型別的時候使用者傳入 string 型別手動觸發乙個 typeerror ,或是當需要正數但接收到負數的時候手動觸發乙個 valueerror ,都比 assertionerror好理解一些。

例一像這種情況,使用異常顯然更好。

例二假設我們要在 ldap 伺服器上的乙個組中刪除或編輯乙個使用者

這個情況下,用斷言更合適。因為 _modify_group() 是在程式內部被呼叫的,而不會被使用者手動呼叫。

我們應該丟擲哪種型別的異常

編寫**的時候,學會使用一些內建的異常,特別是 valueerror 、attributeerror 、typeerror 和 runtimeerror 。常見的庫丟擲的異常都是有規律的,很多庫都有乙個基本的異常型別。比如,requests 的自定義異常都是繼承的 requesterror 。

如果有人使用你的庫,這樣的話他們就能比較方便的捕捉相應的異常。如果你丟擲各式各樣的異常,又沒有文件說明,很多時候使用者便會捕捉乙個大範圍的異常,比如 [base]exception 等。

記住,盡量避免捕獲 [base]exception ,這個有不少***。它可能會捕捉到(也有可能忽略)鍵盤中斷( keyboardinterrupt )( ctrl + c)或斷言錯誤( asstionerror )等異常。所以,你也不應該丟擲 [base]exception 異常。

小結* 使用斷言去檢測程式中理論上不應該出現的情況。注意 python 帶 -o 選項執行時,斷言會被忽略。

* 當由使用者輸入或者外部環境(比如網路延遲、檔案不存在等)引起的問題時,我們應丟擲異常。

* 盡量避免丟擲或捕獲 [base]exception 。

Python中異常和斷言

異常的型別主要有 exception 所有異常的基類 attributeerror 不存在屬性 ioerror 輸入或輸出異常 importerror 無法引入模組或包。一般是路徑問題或模組名稱有誤 indentationerror 語法錯誤 syntaxerror子類 一般是 縮排錯誤 keyer...

python中異常 斷言及執行緒小結

python異常的終極形態 try 匡除了你感覺會丟擲異常的 except try 塊丟擲異常了,該執行什麼內容 else try 塊中沒有丟擲異常,則執行這裡 finally 不管如何,都會執行該 塊 異常怎麼用 1 捕獲正確的異常,不要直接try except,或者針對不同的異常寫不同的exce...

Python中的斷言

在python中,做出斷言的語句是assert,assert後面跟任何合法的表示式,assert語句做出乙個判斷,如果結果為true,則該語句不做任何事情,如果結果為false,assert語句會丟擲異常assertionerror,這個丟擲異常很有作用,我們可以在assert語句後加上解釋性語句,...