Python實用指南:異常處理

每個程序員的夢想都是編寫一個可以平穩(wěn)運行的程序,然而通常情況并非如此,我們的程序經常會遇到錯誤,一旦出現錯誤,代碼的執(zhí)行就會停止。
意外的情況或條件可能會導致錯誤。Python 將這些情況視為異常,并根據異常的類型引發(fā)不同類型的錯誤。
ValueError、 TypeError、 AttributeError 和 SyntaxError 是這些異常的一些示例。好消息是 Python 還提供了處理異常的方法。
考慮下面的代碼,它要求用戶輸入一個數字并打印該數字的平方。
a = int(input("Please enter a number: "))print(f'{a} squared is {a*a}')
只要輸入是一個數字,它就可以正常工作。然而,如果用戶輸入一個字符串,python 將引發(fā)一個 ValueError:

我們可以在代碼中實現一個 try-except 塊來更好地處理這個異常。例如,我們可以向用戶返回一個更簡單的錯誤消息,或者請求他們提供另一個輸入。
try:a = int(input("Please enter a number: "))print(f'{a} squared is {a*a}')except:print("Wrong input type! You must enter a number!")
在上述情況下,代碼會更清楚地告知用戶有關錯誤的信息。
如果由于 try 塊中的代碼引發(fā)了異常,則執(zhí)行將繼續(xù)使用 except 塊中的語句。因此將由程序員決定如何處理異常。
普通的 try-except 塊將捕獲任何類型的錯誤。但是,我們可以更具體一些。例如,我們可能只對特定類型的錯誤感興趣,或者希望以不同的方式處理不同類型的錯誤。
可以用 except 語句指定錯誤類型??紤]下面的代碼,它要求用戶從列表中輸入一個數字。然后,它根據輸入從字典返回一個名稱。
dict_a = {1:'Max', 2:'Ashley', 3:'John'}number = int(input(f'Pick a number from the list: {list(dict_a.keys())}'))
如果用戶輸入一個不在給定列表中的數字,我們將得到一個 KeyError。如果輸入不是一個數字,我們將得到一個 ValueError。我們可以使用兩個語句來處理這兩種情況。
try:dict_a = {1:'Max', 2:'Ashley', 3:'John'}number = int(input(f'Pick a number from the list:{list(dict_a.keys())}'))print(dict_a[number])except KeyError:print(f'{number} is not in the list')except ValueError:print('You must enter a number!')

Python 還允許引發(fā)自己的異常。它類似于自定義默認異常。Raise 關鍵字和錯誤類型可以用于創(chuàng)建自己的異常。
try:a = int(input("Please enter a number: "))print(f'{a} squared is {a*a}')except:raise ValueError("You must enter a number!")
下面是非數字輸入情況下的錯誤消息。
ValueError: You must enter a number!讓我們再舉一個例子,說明如何在函數中使用 try-except 塊。
函數的作用是: 返回數字列表的平均值。
a = [1, 2, 3]def avg_value(lst):avg = sum(lst) / len(lst)return avgprint(avg_value(a))2
如果我們向這個函數傳遞一個空列表,它將給出一個 ZeroDivisionError,因為空列表的長度為零。
我們可以在函數中實現一個 try-except 塊來處理此異常。
def avg_value(lst):try:avg = sum(lst) / len(lst)return avgexcept:print('Warning: Empty list')return 0
對于空列表,函數將打印一個警告并返回0。
a = []print(avg_value(a))Warning: Empty list0
Try 和 except 塊用于處理異常。assert 用于確保條件符合函數的需求。
如果 assert 為 false,則函數不會繼續(xù)。因此,assert 可以作為防御性編程的一個例子,確保一切都按照預期進行。
讓我們在 av_value 函數中實現 assert,確保列表不是空的。
def avg_value(lst):assert not len(lst) == 0, 'No values'avg = sum(lst) / len(lst)return avg
如果列表的長度為零,則函數立即終止,否則,函數將繼續(xù)運行直到結束。
如果 assert 語句中的條件為 false,則會引發(fā) AssertionError:
a = []print(avg_value(a))AssertionError: No values
assert 對于發(fā)現代碼中的錯誤非常有用,因此,它們可以用來支持測試。
總結
我們已經介紹了如何在代碼中實現 try,except 和 assert。這在許多情況下都很有用,為程序員提供了對代碼的更多控制和監(jiān)督,使得他們能很好地發(fā)現和處理異常。
個人微信(如果沒有備注不拉群!) 請注明:地區(qū)+學校/企業(yè)+研究方向+昵稱
下載1:何愷明頂會分享
在「AI算法與圖像處理」公眾號后臺回復:何愷明,即可下載。總共有6份PDF,涉及 ResNet、Mask RCNN等經典工作的總結分析
下載2:終身受益的編程指南:Google編程風格指南
在「AI算法與圖像處理」公眾號后臺回復:c++,即可下載。歷經十年考驗,最權威的編程規(guī)范!
下載3 CVPR2020 在「AI算法與圖像處理」公眾號后臺回復:CVPR2020,即可下載1467篇CVPR 2020論文
覺得不錯就點亮在看吧

