1. 程式人生 > >異常與錯誤

異常與錯誤

網絡 strong 進行 機制 滿足 traceback 打印錯誤 projects img

一.異常和錯誤 什麽是錯誤
  • 語法錯誤
    • 無法通過python解釋器的語法檢測
    • 在寫代碼的時候應該規避掉
  • 邏輯錯誤
什麽是異常
  • 程序運行時發生錯誤的信號
什麽時候容易發生異常
  • 當要處理的內容不確定的時候
    • 有用戶參與
    • 有外接數據接入: 從文件中讀 , 從網絡上獲取等
異常信息的查看 技術分享圖片 當有多行報錯的時候是為什麽 在嵌套調用的過程中, 內部的代碼出了問題, 外部所有的調用的地方都成為報錯追溯信息的一部分. 如何解決 從下往上找, 首先找到出錯的那一行代碼, 如果能看出問題, 就直接解決 不能, 就把報錯的最後一行, 錯誤類型和詳細提示貼到百度裏, 結合報錯的那一行去處理 def func1(): name def func2(): func1() def main(): func2() main() 錯誤信息:
Traceback (most recent call last): File "G:/utilities/Python/Python36/projects36/day20/4.異常基礎處理.py", line 7, in <module> main() File "G:/utilities/Python/Python36/projects36/day20/4.異常基礎處理.py", line 6, in main func2() File "G:/utilities/Python/Python36/projects36/day20/4.異常基礎處理.py", line 4, in func2 func1() File "G:/utilities/Python/Python36/projects36/day20/4.異常基礎處理.py", line 2, in func1 # 這一行是問題的源頭
name NameError: name ‘name‘ is not defined # 如果無法解決, 就將該行信息粘貼到百度去處理 二.異常處理 1.什麽是異常
  • 程序運行時發生錯誤的信號
  • 異常之後的代碼就不執行了
2.什麽是異常處理
  • python解釋器檢測到錯誤, 觸發異常
  • 程序員編寫特定的代碼, 專門用來捕捉這個異常
  • 如果捕捉成功則進入另外一個處理分支, 執行你為其定制的邏輯, 使程序不會崩潰, 這就是異常處理
3.為什麽要進行異常處理 python解釋器去執行程序, 檢測到了一個錯誤時, 觸發異常, 異常觸發後且沒被處理的情況下, 程序就在當前異常處終止, 後面的代碼不會運行, 非常非常影響用戶體驗 需要提供一種異常處理機制來增強你程序的健壯性與容錯性 4.如何進行異常處理 首先須知, 異常是有程序的錯誤引起的, 語法上的錯誤跟異常處理無關, 必須在程序運行前就處理 5.異常處理的幾種寫法 單分支 try: 被檢測的代碼塊 except 異常類型: try中一旦檢測到此處的異常類型, 就執行這裏的邏輯 多分支 try: 被檢測的代碼塊 except 異常類型1: try中一旦檢測到此處的異常類型, 就執行這裏的邏輯 except 異常類型2: try中一旦檢測到此處的異常類型, 就執行這裏的邏輯 except ... 註:
1. 報錯的代碼信息會從上向下進行查找, 只要找到和報錯類型相符的分支, 就停止查找, 執行這個分支中的代碼, 然後直接退出分支 2. 如果找不到能處理和報錯類型相同的分支, 會一直往下走, 最後還是沒有找到就會報錯 多分支合並 try: 被檢測的代碼塊 except (異常類型1, 異常類型2, 異常類型3, ...): try中一旦檢測到此處的異常類型, 就執行這裏的邏輯 萬能異常 # 寫法一: try: 被檢測的代碼塊 except Exception: try中出現的所有異常, 都會執行這裏的邏輯 # 寫法二: try: 被檢測的代碼塊 except: try中出現的所有異常, 都會執行這裏的邏輯 註: 不會打印錯誤的信息 as語法
  • 常和萬能異常搭配使用
  • 其他單分支或多分支等也是都可以使用的
try: name except Exception as e: # 這裏的e就是一個變量, 寫什麽都可以 print(e) # 打印錯誤信息 註: Exception 使用as語法, 用來打印錯誤信息 多分支 + 萬能異常 try: 被檢測的代碼塊 except 異常類型1: try中一旦檢測到此處的異常類型, 就執行這裏的邏輯 except 異常類型2 as e: # 這裏也可以使用as語法的哦! try中一旦檢測到此處的異常類型, 就執行這裏的邏輯 except Exception as e: print(e) 不滿足上面的異常類型時, 都會執行這裏的邏輯 註: 萬能異常永遠在異常處理的最下面 else分支 try: 被檢測的代碼塊 except 異常類型: try中一旦檢測到此處的異常類型, 就執行這裏的邏輯 else: 當try中代碼不發生異常的時候, 走else分支 註: 應用場景 發郵件, 當網絡穩定的時候或郵箱地址錯誤時, 重新發送 當發送成功時, 進行後續的處理 finally分支 try: 被檢測的代碼塊 except 異常類型1: try中一旦檢測到此處的異常類型, 就執行這裏的邏輯 except 異常類型2: try中一旦檢測到此處的異常類型, 就執行這裏的邏輯 except Exception as e: print(e) 不滿足上面的異常類型時, 都會執行這裏的邏輯 else: 當try中代碼不發生異常的時候, 走else分支 finally: 無論如何都會被執行 應用場景: 例如打開一個文件操作, 如果文件打開了在操作的過程中, 出現問題, 有finally那文件就可以被關閉; 沒有出現問題, 文件也會被關閉. 所以, finally可以用來回收一些操作系統的資源: 數據庫連接, 打開的文件句柄, 網絡連接等 註: 1. 有finally時, finally在最下面 2. 註意這裏寫的順序 6.其他操作 6.1主動拋出異常 raise
  • 這個是給其他開發者用的, 而不是給用戶拋的
  • 例如:我們使用別人開發的框架, 在使用時可以給我們主動拋出異常讓我們處理, 而我們開發完畢的程序, 是不能拋出異常給用戶看的, 這樣是很不友好的
raise ValueError(‘你寫的不對呀!‘) 結果: ValueError: 你寫的不對呀! 6.2斷言 assert assert 1 == 1 # 條件成立, 程序繼續往下執行 assert 1 == 2 # 條件不成立, 程序不會繼續往下執行

異常與錯誤