在初學Python的時候最容易犯的錯誤就是Python的語法錯誤。python
在Python中,若是錯誤信息是以 "SyntaxError" 開頭,表示這是一個語法錯誤;Python解釋器會提示在哪一個文件的第幾行的什麼位置出現錯誤;語法錯誤一般意味着書寫格式或使用方式不正確。函數
程序在運行時,若是Python解釋器遇到一個錯誤,會中止程序的執行,而且提示一些錯誤信息,這就是異常。code
程序中止執行而且提示錯誤信息這個動做,一般稱之爲拋出異常(raise Exception)。對象
在程序開發中,若是對某些代碼的執行不能肯定是否正確,能夠增長try(嘗試)來捕獲異常。blog
捕獲異常最簡單的語法格式以下:圖片
try: 嘗試執行的代碼 except: 出現錯誤的處理
try:嘗試,下方編寫要嘗試的不肯定是否可以正常執行的代碼。開發
except:若是不是,下方編寫提示錯誤的代碼。字符串
print('簡單的捕獲異常') while True: try: num = int(input('請輸入一個整數:')) except: print('請輸入有效的數字!') break print('-' * 9)
捕獲異常 請輸入一個整數:10 --------- 請輸入一個整數:a 請輸入有效的數字!
在程序執行時,可能會遇到不一樣類型的異常,而且須要針對不一樣類型的異常,作出不一樣的響應,這個時候就須要捕獲錯誤類型。input
針對錯誤類型捕獲異常的語法格式以下:io
try: # 嘗試執行的代碼 pass except 錯誤類型1: # 針對錯誤類型1,對應的代碼處理 pass except (錯誤類型2, 錯誤類型3): # 針對錯誤類型2和3,對應的代碼處理 pass except Exception as result: print('未知錯誤%s' % result)
當Python解釋器拋出異常時,最後一行錯誤信息的第一個單詞,就是錯誤類型。
在開發時,要預判到全部可能出現的錯誤,仍是有必定難度的。 若是但願程序不管出現任何錯誤,都不會由於拋出異常而被終止,則能夠增長一個未知錯誤的異常判斷。
print('針對錯誤類型捕獲異常') while True: try: num = int(input('請輸入一個整數:')) result = 8 / num print(result) except ValueError: print('傳入無效的參數!') except ZeroDivisionError: print('除0錯誤!') break print('-' * 9)
針對錯誤類型捕獲異常 請輸入一個整數:a 傳入無效的參數! --------- 請輸入一個整數:0 除0錯誤!
print('捕獲未知錯誤') while True: try: num = int(input('請輸入一個整數:')) result = 8 / num print(result) except ValueError: print('傳入無效的參數!') except Exception as e: print('未知錯誤:%s' % e) break print('-' * 9)
捕獲未知錯誤 請輸入一個整數:a 傳入無效的參數! --------- 請輸入一個整數:0 未知錯誤:division by zero
在實際開發中,爲了可以處理複雜的異常狀況,相應有一套完整的異常語法,語法格式以下:
try: # 嘗試執行的代碼 pass except 錯誤類型1: # 針對錯誤類型1,對應的代碼處理 pass except (錯誤類型2, 錯誤類型3): # 針對錯誤類型2和3,對應的代碼處理 pass except Exception as result: print('未知錯誤%s' % result) else: # 沒有異常纔會執行的代碼 pass finally: # 不管是否有異常或是否捕獲了異常,finally子句都會保證執行 pass
print('捕獲異常的完整語法') while True: try: num = int(input('請輸入一個整數:')) result = 8 / num print(result) except ValueError: print('傳入無效的參數!') except Exception as e: print('未知錯誤:%s' % e) else: print('嘗試成功!') # 沒有異常纔會執行 finally: print('結束!') # 不管有沒有異常都會執行 print('-' * 9)
捕獲異常的完整語法 請輸入一個整數:8 1.0 嘗試成功! 結束! --------- 請輸入一個整數:a 傳入無效的參數! 結束! --------- 請輸入一個整數:0 未知錯誤:division by zero 結束!
當函數/方法執行出現異常,會將異常傳遞給函數/方法的調用一方,若是傳遞到主程序,仍然沒有異常處理,程序纔會被終止。
在開發中,能夠在主函數中增長異常捕獲;而在主函數中調用的其它函數,只要出現異常,都會傳遞到主函數的異常捕獲中;這樣就不須要在代碼中,增長大量的異常捕獲,可以保證代碼的簡潔。
def demo1(): return int(input('請輸入一個整數:')) def demo2(): return demo1() try: print(demo2()) except ValueError: print('請輸入有效的數字!') except Exception as result: print('未知錯誤%s' % result)
請輸入一個整數:a 請輸入有效的數字!
在開發中,除了代碼執行出錯Python解釋器會拋出異常以外,還能夠根據應用程序特有的業務需求主動拋出異常。
Python中提供了一個 "Exception" 異常類,在開發時若是知足特定業務需求時,但願拋出異常,那麼應該首先建立一個 "Exception" 的對象,其次使用 "raise" 關鍵字拋出異常對象。
當前函數只負責提示用戶輸入密碼,若是密碼長度不正確,須要由其它的函數進行額外處理。
需求:
def input_password(): pwd = input('請輸入密碼:') # 提示用戶輸入密碼 if len(pwd) >= 8: # 判斷密碼長度是否 >= 8,若是是則返回輸入的密碼 return pwd print('主動拋出異常') ex = Exception('密碼長度小於8位數!') # 建立異常對象,可使用錯誤信息字符串做爲參數 raise ex # 主動拋出異常 try: # 捕獲異常 print(input_password()) except Exception as result: print(result)
請輸入密碼:12345 主動拋出異常 密碼長度小於8位數!