摘要:異常即使程序的語法是正確的,但是在運行的時候,也有可能發生錯誤,運行期監測到的錯誤稱為異常。此時可以打印出錯誤信息,然后再次把異常拋出。這個子句將在子句沒有發生任何異常的時候執行。異常類繼承自,可以直接繼承,或者間接繼承。
1. 語法錯誤
Python 的語法錯誤被稱為解析錯,語法分析器會指出出錯的代碼行,并且在最先找到的錯誤的位置標記一個小小的箭頭。
>>> while True File "2. 異常", line 1 while True ^ SyntaxError: invalid syntax
即使 Python 程序的語法是正確的,但是在運行的時候,也有可能發生錯誤,運行期監測到的錯誤稱為異常。
>>> print(name) Traceback (most recent call last): File "3. 異常處理", line 1, in NameError: name "name" is not defined >>> a = [1, 2, 3] >>> b = a(0) Traceback (most recent call last): File " ", line 1, in TypeError: "list" object is not callable >>> 10 / 0 Traceback (most recent call last): File " ", line 1, in ZeroDivisionError: division by zero
try 語句按照以下方式工作:
首先,執行 try 子句,也就是在 try 和 except 之間的語句
如果沒有異常發生,忽略 except 子句,程序繼續運行
如果在 try 子句執行過程中發生了異常,那么 try 子句余下的部分將被忽略
若異常的類型和 except 之后的名稱相符,那么對應的 except 子句將被執行,然后再執行 try 語句之后的代碼
若異常沒有與任何的 except 匹配,那么這個異常將會傳遞到上層的 try 中去
while True: try: x = int(input("Please enter a number: ")) break except ValueError: print("Oops! That was no valid number. Try again!") Please enter a number: we Oops! That was no valid number. Try again! Please enter a number: sd Oops! That was no valid number. Try again! Please enter a number: 23
在上面的例子中,我們讓用戶通過鍵盤來輸入一個合法的整數。如果輸入的是字符串,那 int 函數就無法將字符串轉為整數,程序就會拋出一個異常,然后執行 except 子句,打印信息提示我們重新輸入,直到輸入一個整數程序 break 結束。
一個 except 子句可以同時處理多個異常,這些異常被放在一個括號里成為一個元組。
except (RuntimeError, TypeError, NameError): pass
最后一個 except 子句可以忽略異常的名稱,它將被當做通配符使用。此時可以打印出錯誤信息,然后再次把異常拋出。
import sys try: f = open("test.txt") s = f.readline() i = int(s.strip()) except OSError as err: print("OS error: {0}".format(err)) except ValueError: print("Could not convert data to an integer.") except: print("Unexpected error:", sys.exc_info()[0]) raise # 沒有相應文件時報錯 OS error: [Errno 2] No such file or directory: "test.txt" # 文件中第一行為字符串無法轉化為整數時報錯 Could not convert data to an integer.
try except 語句還有一個可選的 else 子句,如果使用這個子句,那么必須放在所有的 except 子句之后。這個子句將在try子句沒有發生任何異常的時候執行。
import sys try: f = open("test.txt") s = f.readline() i = int(s.strip()) except OSError as err: print("OS error: {0}".format(err)) except ValueError: print("Could not convert data to an integer.") except: print("Unexpected error:", sys.exc_info()[0]) raise else: print(i) # 1
使用 else 子句比把所有語句都放在 try 子句里面要好,這樣可以避免一些意想不到的而 except 又沒有捕獲到的異常。
異常處理也可以處理子句中調用函數甚至是間接調用函數里拋出的異常。
3. 用戶自定義異常我們可以通過創建一個新的異常類來擁有自己的異常。異常類繼承自 Exception,可以直接繼承,或者間接繼承。
class MyError(Exception): def __init__(self, value): self.value = value def __str__(self): return repr(self.value) try: raise MyError(2*2) except MyError as e: print("My exception occurred, value:", e.value) # My exception occurred, value: 44. 定義清理行為
try 語句還有另外一個可選的子句 finally,它定義了無論任何情況下都會執行的清理行為。
def divide(x, y): try: result = x / y except ZeroDivisionError: print("division by zero!") else: print("result is", result) finally: print("executing finally clause") divide(2, 1) result is 2.0 executing finally clause divide(2, 0) division by zero! executing finally clause
divide("2", "1") executing finally clause TypeError Traceback (most recent call last)in () ----> 1 divide("2", "1") in divide(x, y) 1 def divide(x, y): 2 try: ----> 3 result = x / y 4 except ZeroDivisionError: 5 print("division by zero!") TypeError: unsupported operand type(s) for /: "str" and "str"
一些對象定義了標準的清理行為,當程序中不需要它的時候,那么這個標準行為就會執行。關鍵詞 with 語句可以保證諸如文件之類的對象在使用完之后一定會正確=地執行清理行為。
參考資料 菜鳥教程
獲取更多精彩,請關注「seniusen」!
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/44878.html
摘要:中異常處理類主要包含兩個方法和,其中就是主要用來向第三方發送異常報告,這里選擇向這個神器發送異常報告,并使用通知開發人員。通過也能發現的執行流程。 說明:Laravel學習筆記之bootstrap源碼解析中聊異常處理時提到過Sentry這個神器,并打算以后聊聊這款神器,本文主要就介紹這款Errors Tracking神器Sentry,Sentry官網有一句話個人覺得帥呆了: Stop ...
摘要:但如果忽視異常輕則影響功能運行,重則導致系統崩潰,造成經濟損失。異常處理捕獲異常捕獲關鍵字與一致,都是使用。語句塊表示無論是否發生異常,語句塊代碼一定會被執行。 不少前端工程師看到這個標題可能會產生質問: 我js用得好好的,能后端能APP,為什么還要學習Python? 至少有下面兩個理由: 學習曲線。ES6之后的JavaScript(TypeScript)的在語法上和Python有很...
摘要:本文與大家分享一些編程語言的入門書籍,其中不乏經典。全書貫穿的主體是如何思考設計開發的方法,而具體的編程語言,只是提供一個具體場景方便介紹的媒介。入門入門容易理解而且讀起來幽默風趣,對于編程初學者和語言新手而言是理想的書籍。 本文與大家分享一些Python編程語言的入門書籍,其中不乏經典。我在這里分享的,大部分是這些書的英文版,如果有中文版的我也加上了。有關書籍的介紹,大部分截取自是官...
閱讀 2973·2021-10-27 14:16
閱讀 695·2021-10-13 09:39
閱讀 3670·2021-09-29 09:46
閱讀 2090·2019-08-30 15:54
閱讀 2597·2019-08-30 15:52
閱讀 2994·2019-08-30 15:44
閱讀 1103·2019-08-30 15:44
閱讀 497·2019-08-30 10:51