不用try也可以優雅的處理異常

2021-10-12 06:25:02 字數 1964 閱讀 7023

pythonista[1]們都知道使用 try 和 except 來處理可能發生的異常,當異常發生時執行我們預先編寫好的**塊。

但是常碰到的情形是這樣的:

我們知道這個異常有可能發生

我們不關心這個異常,如果發生了,什麼也不用處理,直接忽略就好

如果要處理這種情形的異常,那麼不必使用 try-except,python 內建的 contextlib 庫提供了乙個函式,叫 suppress,是處理這種異常更優雅的方式,pythonista 一定要嘗試使用。

假如我們要對一系列數字的倒數求和,這些數字可能會出現 0,因此需要處理異常,通常情況下,如果使用 try 和 except 會是這樣的:

nums = [3,0,3,0,3]

result = 0

for num in nums:

try:

result += 1/num

except zerodivisionerror:

pass

print(result) # 1.0

這裡,我們捕捉了 zerodivisionerror 異常並忽略,最終得到數字的倒數的和為 1.0。

假如我們使用 contextlib 庫提供的 suppress,**就是這樣的:

from contextlib import suppress

nums = [3,0,3,0,3]

result = 0

for num in nums:

with suppress(zerodivisionerror):

result += 1/num

print(result) # 1.0

從形式上看,suppress 的**行數更少,看來也更優雅,更易於閱讀理解。

有人會說了,我使用下面的方法一行就搞定了:

result = sum([1/x for x in nums if x != 0])

這當然是完全正確的,上述只是以這個為例子說明下 suppress 的用法,不過當異常型別增多的時候,上述的方法也有弊端,比如數字除了不能為 0,也不能為字串的情況, 那麼就需要寫成這樣:

nums = [3,0,3,0,3,『3』] #有字串,也需要忽略

result = sum([1/x for x in nums if x != 0 and type(x) == int])

當異常的情況不斷增多,這種寫法就很難看了,而使用 suppress,只需要這樣:

for num in nums:

with suppress(zerodivisionerror, typeerror):

result += 1/num

甚至,你想忽略所有的異常,只需要給 suppress 傳入異常類的基礎類 exception 即可:

for num in nums:

with suppress(exception):

result += 1/num

需要注意的是,不要這樣寫

result = 0

nums = [3,0,3,0,3]

with suppress(exception):

for num in nums:

result += 1/num

print(result) # 0.3333333333333333

如果 suppress 寫在了迴圈體的外面,當發生異常時,後面的迴圈操作將會被 break,因此這種情況下,結果是 0.333333,原因就是第二個數是 0 引發的異常,這個異常雖然被忽略,但後面的迴圈也停止了。這一點不是 suppress 特有的,你把 try 放迴圈外面也是一樣的:

result = 0

nums = [3,0,3,0,3]

try:

for num in nums:

result += 1/num

except exception:

pass

print(result) # 0.3333333333333333

不用程式設計就可以做好的事情

這兩天做了三件事,都是貌似要寫乙個軟體而我找到了代替的方案,一行 也不用寫。其二是,有人要統計一萬多份調查問卷,問卷內容很簡單 20個人中選10個,在選中的人名字下面打勾。原來我曾經寫了乙個程式幫他們做更複雜的錄入輔助兼統計,用到delphi c s模式,firebird做後台資料庫。這次的因為相對...

複雜的編號也可以輕鬆填

在單位工作的時候,經常會遇到輸入一些複雜編號的事情。比如輸入員工的工號和身份證號等等。這些編號,往往前面的幾位數字是固定的,而後幾位數字則是按照正常的排序進行編號。如果我們手工輸入這些複雜編號,那當然會很麻煩,而且還很可能會出錯,所以,應該想辦法讓這些事情變得簡單些。1 在excel中輸入 這類問題...

網線只用1236 為什麼可以不用4578的原理

10m乙太網的網線只使用1 2 3 6編號的芯線傳遞資料,即1 2用於傳送,3 6用於接收,按顏色來說 橙白 橙兩條用於傳送 綠白 綠兩條用於接收。另外四根4 5,7 8是雙向線,起到消除干擾的輔助作用,在1 2 3 6中有一些無效連線時自動補上。如果排線管上面沒有其它高壓電流的話那麼完全可以不用這...