那曲檬骨新材料有限公司

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Python錯誤及異常總結匯總

馬哥Linux運維 ? 來源:未知 ? 作者:鄧佳佳 ? 2018-03-06 17:03 ? 次閱讀

前言

程序員的一生中,錯誤幾乎每天都在發生。在過去的一個時期, 錯誤要么對程序(可能還有機器)是致命的,要么產生一大堆無意義的輸出,無法被其他計算機或程序識別,連程序員自己也可能搞不懂它的意義。一旦出現錯誤,程序就會終止執行,直到錯誤被修正,程序重新執行。所以,人們需要一個”柔和”的處理錯誤的方法,而不是終止程序。同時,程序本身也在不斷發展,并不是每個錯誤都是致命的,即使錯誤發生,編譯器或是在執行中的程序也可以提供更多更有用的診斷信息,幫助程序員盡快解決問題。然而,錯誤畢竟是錯誤,一般都是停止編譯或執行后才能去解決它。一小段代碼只能讓程序終止執行,也許還能打印出一些模糊的提示。當然,這一切都是在異常和異常處理出現之前的事了。

1. 錯誤

從軟件方面來說,錯誤是語法或是邏輯上的。語法錯誤指示軟件的結構上有錯誤,導致不能被解釋器解釋或編譯器無法編譯。這些錯誤必須在程序執行前糾正。當程序的語法正確后,剩下的就是邏輯錯誤了。邏輯錯誤可能是由于不完整或是不合法的輸入所致;在其他情況下,還可能是邏輯無法生成,計算,或是輸出結果需要的過程無法執行。這些錯誤通常分別被稱為域錯誤和范圍錯誤。

Python 檢測到一個錯誤時,解釋器就會指出當前流已經無法繼續執行下去,這時候就出現了異常。

2. 異常

對異常的最好描述是: 它是因為程序出現了錯誤而在正常控制流以外采取的行為。這個行為又分為兩個階段: 首先是引起異常發生的錯誤,然后是檢測(和采取可能的措施)階段。

第一個階段是在發生了一個異常條件(有時候也叫做例外的條件)后發生的。只要檢測到錯誤并且意識到異常條件,解釋器會引發一個異常。引發也可以叫做觸發或者生成,解釋器通過它通知當前控制流有錯誤發生。Python 也允許程序員自己引發異常,無論是 Python 解釋器還是程序員引發的,異常就是錯誤發生的信號,當前流將被打斷,用來處理這個錯誤并采取相應的操作,這就是第二階段。

對異常的處理發生在第二階段。異常引發后,可以調用很多不同的操作,可以是忽略錯誤(記錄錯誤但不采取任何措施, 采取補救措施后終止程序),或是減輕問題的影響后設法繼續執行程序。所有的這些操作都代表一種繼續,或是控制的分支,關鍵是程序員在錯誤發生時可以指示程序如何執行。

類似 Python 這樣支持引發和處理異常(這更重要)的語言,可以讓開發人員可以在錯誤發生時更直接地控制它們。程序員不僅僅有了檢測錯誤的能力,還可以在它們發生時采取更可靠的補救措施。由于有了運行時管理錯誤的能力,應用程序的健壯性有了很大的提高。

異常和異常處理并不是什么新概念。它們同樣存在于 Ada,Modula-3,C++,Eiffel,以及 Java 中。異常的起源可以追溯到處理系統錯誤和硬件中斷這類異常的操作系統代碼。在 1965 年左右,PL/1 作為第一個支持異常的主要語言出現,而異常處理是作為一個它提供的軟件工具。和其他支持異常處理的語言類似,Python 采用了 “try/嘗試” 塊和 “catching/捕獲” 塊的概念,而且它在異常處理方面更有”紀律性”。我們可以為不同的異常創建不同的處理器,而不是盲目地創建一個”catch-all/捕獲所有”的代碼。

3. python中常見異常

NameError:嘗試訪問一個未聲明的變量

NameError表示我們訪問了一個沒有初始化的變量. 在 Python 解釋器的符號表沒有找到那個另人討厭的變量. 我們將在后面的兩章討論名稱空間, 現在大家可以認為它們是連接名字和對象的”地址簿”就可以了. 任何可訪問的變量必須在名稱空間里列出. 訪問變量需要由解釋器進行搜索, 如果請求的名字沒有在任何名稱空間里找到, 那么將會生成一個NameError異常.

ZeroDivisionError:除數為零

我們邊的例子使用的是整數, 但事實上, 任何數值被零除都會導致一個ZeroDivisionError異常.

SyntaxError:Python 解釋器語法錯誤

SyntaxError 異常是唯一不是在運行時發生的異常.它代表 Python 代碼中有一個不正確的結構, 在它改正之前程序無法執行. 這些錯誤一般都是在編譯時發生, Python 解釋器無法把你的腳本轉化為 Python 字節代碼. 當然這也可能是你導入一個有缺陷的模塊的時候.

IndexError:請求的索引超出序列范圍

IndexError在你嘗試使用一個超出范圍的值索引序列時引發.

KeyError:請求一個不存在的字典關鍵字

映射對象, 例如字典, 是依靠關鍵字(keys)訪問數據值的. 如果使用錯誤的或是不存在的鍵請求字典就會引發一個KeyError異常.

IOError:輸入/輸出錯誤

類似嘗試打開一個不存在的磁盤文件一類的操作會引發一個操作系統輸入/輸出(I/O)錯誤. 任何類型的 I/O 錯誤都會引發IOError異常.

AttributeError:嘗試訪問未知的對象屬性

我們在 myInst.hp 儲存了一個值, 也就是實例 myInst 的 hp 屬性. 屬性被定義后, 我們可以使用熟悉的點/屬性操作符訪問它, 但如果是沒有定義屬性, 例如我們訪問 hq 屬性, 將導致一個AttributeError異常.

4. 檢測和處理異常

異常可以通過try語句來檢測。任何在try語句塊里的代碼都會被監測,檢查有無異常發生。

try語句有兩種主要形式:try-except和try-finally. 這兩個語句是互斥的, 也就是說你只 能 使 用 其 中 的 一 種 . 一 個try語 句 可 以 對 應 一 個 或 多 個except子 句 , 但 只 能 對 應 一 個finally子句, 或是一個try-except-finally復合語句.

你可以使用try-except語句檢測和處理異常. 你也可以添加一個可選的else子句處理沒有探測到異常的時執行的代碼. 而try-finally只允許檢測異常并做一些必要的清除工作(無論發生錯誤與否), 沒有任何異常處理設施. 正如你想像的, 復合語句兩者都可以做到.

try-except 語句

最 常 見 的try-except語 句 語 法 如 下 所 示,它 由try塊 和except塊 (try_suite 和 except_suite )組成,也可以有一個可選的錯誤原因。

帶有多個 except 的 try 語句

這種格式的 except 語句指定檢測名為 Exception 的異常. 你可以把多個 except 語句連接在一起, 處理一個 try 塊中可能發生的多種異常, 如下所示:

處理多個異常的 except 語句

我們還可以在一個 except 子句里處理多個異常,前提只是它們被放入一個元組里 , 如下:

Note:try語句塊中異常發生點后的剩余語句永遠不會到達(所以也永遠不會執行)。一旦一個異常被引發,就必須決定控制流下一步到達的位置。剩余代碼將被忽略,解釋器將搜索處理器,一旦找到,就開始執行處理器中的代碼。

如果沒有找到合適的處理器,那么異常就向上移交給調用者去處理,這意味著堆棧框架立即回到之前的那個。如果在上層調用者也沒找到對應處理器,該異常會繼續被向上移交,直到找到合適處理器。如果到達最頂層仍然沒有找到對應處理器,那么就認為這個異常是未處理的,Python 解釋器會顯示出跟蹤返回消息,然后退出。

Python 提供給程序員的try-except語句是為了更好地跟蹤潛在的錯誤并在代碼里準備好處理異常的邏輯,這樣的機制在其他語言(例如 C ) 是很難實現的,它的目的是減少程序出錯的次數并在出錯后仍能保證程序正常執行。作為一種工具而言,只有正確得當地使用它,才能使其發揮作用。

避免把大片的代碼裝入try-except中然后使用pass忽略掉錯誤,你可以捕獲特定的異常并忽略它們,或是捕獲所有異常并采取特定的動作。不要捕獲所有異常,然后忽略掉它們。

異常參數

異常也可以有參數,異常引發后它會被傳遞給異常處理器。當異常被引發后參數是作為附加幫助信息傳遞給異常處理器的。雖然異常原因是可選的,但標準內建異常提供至少一個參數,指示異常原因的一個字符串。

異常的參數可以在處理器里忽略,但 Python 提供了保存這個值的語法,我們已經在上邊接觸到相關內容:要想訪問提供的異常原因,你必須保留一個變量來保存這個參數。把這個參數放在except語句后,接在要處理的異常后面。

reason 將會是一個包含來自導致異常的代碼的診斷信息的類實例。異常參數自身會組成一個元組,并存儲為類實例 ( 異 常 類 的 實 例 ) 的 屬 性 。上 邊 的 第 一 種 用 法 中,reason 將 會 是 一 個Exception類的實例。

else 子句

我們已經看過else語句段配合其他的 Python 語句,比如條件和循環。至于try-except語句段,它的功能和你所見過的其他else沒有太多的不同:在try范圍中沒有異常被檢測到時,執行else子句。

在else范圍中的任何代碼運行前,try范圍中的所有代碼必須完全成功(也就是,結束前沒有引發異常)。

finally 子句

finally子句是無論異常是否發生,是否捕捉都會執行的一段代碼。你可以將finally僅僅配合try一起使用,也可以和try-except(else 也是可選的)一起使用,也可以使用獨立的try-finally。

當然,無論如何,你都可以有不止一個的except子句,但最少有一個except語句,而else和finally都是可選的。A,B,C 和 D 是程序(代碼塊)。程序會按預期的順序執行。(注意:可能的順序是A-C-D[正常] 或 A-B-D[異常])。無論異常發生在 A,B,和/或 C 都將執行finally塊。

另一種使用finally的方式是finally單獨和try連用。這個try-finally語句和try-except區別在于它不是用來捕捉異常的。作為替代,它常常用來維持一致的行為而無論異常是否發生。我們得知無論try中是否有異常觸發,finally代碼段都會被執行。

try-except-else-finally語句

無論你選擇什么語法,你至少要有一個except子句,而else和finally都是可選的。

with語句

with語句的目的在于從流程圖中把try,except和finally關鍵字和資源分配釋放相關代碼統統去掉,而不是像try-except-finally那樣僅僅簡化代碼使之易用。with語法的基本用法看上去如下:

這段代碼試圖打開一個文件,如果一切正常,把文件對象賦值給 f。然后,用迭代器遍歷文件中的每一行,當完成時,關閉文件。無論在這一段代碼的開始,中間,還是結束時發生異常,都會執行清理的代碼,此外文件仍會被自動的關閉。

5. 觸發異常

raise語句

raise語句對所支持是參數十分靈活,對應到語法上就是支持許多不同的格式.rasie 一般的用法是:

第一個參數,SomeExcpetion,是觸發異常的名字.如果有,它必須是一個字符串,類或實例(詳見下文).如果有其他參數(arg 或 traceback),就必須提供 SomeExcpetion.

第二個符號為可選的 args(比如參數,值),來傳給異常.這可以是一個單獨的對象也可以是一個對象的元組.當異常發生時,異常的參數總是作為一個元組傳入.如果 args 原本就是元組,那么就將其傳給異常去處理;如果 args 是一個單獨的對象,就生成只有一個元素的元組(就是單元素元組).大多數情況下,單一的字符串用來指示錯誤的原因.如果傳的是元組,通常的組成是一個錯誤字符串,一個錯誤編號,可能還有一個錯誤的地址,比如文件,等等.

最后一項參數,traceback,同樣是可選的(實際上很少用它),如果有的話,則是當異常觸發時新生成的一個用于異常-正常化(exception—normally)的追蹤(traceback)對象.當你想重新引發異常時,第三個參數很有用(可以用來區分先前和當前的位置).如果沒有這個參數,就填寫 None.

6. 斷言語句

斷言語句等價于這樣的 Python 表達式,如果斷言成功不采取任何措施(類似語句),否則觸發AssertionError(斷言錯誤)的異常.assert 的語法如下:

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • python
    +關注

    關注

    56

    文章

    4807

    瀏覽量

    85039

原文標題:Python錯誤及異常總結匯總

文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    電源 PCB 布局中的常見錯誤及避免方式

    異常現象、根本原因以及優化布局的方法和相關技巧。 1. 常見錯誤一:功率器件散熱不良 異常現象 功率器件溫度過高,可能導致器件性能下降,甚至損壞。例如,MOSFET 的導通電阻會隨溫度升高而增大,進一步增加功耗,形成惡性循環。
    的頭像 發表于 01-08 15:28 ?434次閱讀

    【科普系列】LIN協議錯誤類型介紹

    了解 LIN總線的錯誤類型對于開發、測試均具有極大的好處。通過對錯誤類型的全面了解,開發人員可以提前預測和避免潛在的問題,增強系統的穩定性、容錯能力和安全性,從而提升系統整體的可靠性和性能。對于測試人員來說則可以更加從容應對總線測試過程中出現的各種
    的頭像 發表于 01-02 17:27 ?3327次閱讀
    【科普系列】LIN協議<b class='flag-5'>錯誤</b>類型介紹

    串口通訊異常處理方法 串口設備連接方式

    串口通信異常處理方法 1. 異常檢測 在串口通信中,首先需要能夠檢測到異常情況。異常檢測可以通過以下幾種方式實現: 硬件檢測 :利用串口硬件的中斷和狀態寄存器來檢測
    的頭像 發表于 12-27 09:53 ?693次閱讀

    對比Python與Java編程語言

    使得編寫代碼更加靈活,但也可能導致運行時錯誤。 Java 語法相對冗長,需要顯式聲明變量類型,增加了代碼的可讀性和安全性。 靜態類型系統在編譯時進行類型檢查,減少了運行時錯誤。 二、性能 Python 解釋型語言,運行速度通常比
    的頭像 發表于 11-15 09:31 ?439次閱讀

    socket編程中的錯誤處理技巧

    錯誤處理能夠確保程序在遇到異常情況時不會崩潰,而是能夠優雅地處理問題。 提升用戶體驗 :通過適當的錯誤處理,可以給用戶提供清晰的錯誤信息,避免用戶感到困惑。 便于調試和維護 :良好
    的頭像 發表于 11-01 17:47 ?948次閱讀

    使用Python構建高效的HTTP代理服務器

    構建一個高效的HTTP代理服務器在Python中涉及多個方面,包括性能優化、并發處理、協議支持(HTTP/HTTPS)、錯誤處理以及日志記錄等。
    的頭像 發表于 10-23 07:41 ?218次閱讀

    如何利用python和API查詢IP地址?

    Python中,直接查詢IP地址的地理位置或詳細信息(如所屬國家、城市等)通常需要依賴外部API服務,因為Python標準庫本身不提供直接查詢IP地址地理位置的功能。以下是一個使用requests
    發表于 08-28 11:55

    服務器錯誤是怎么回事?常見錯誤原因及解決方法匯總

    服務器錯誤是怎么回事?最常見的原因分有六個,分別是:硬件問題、軟件問題、網絡問題、資源耗盡、數據庫、文件權限問題。可以根據以下具體錯誤原因進行辨別,并選擇適合的解決方法。關于常見服務器原因及解決方法如下:
    的頭像 發表于 08-12 10:11 ?1627次閱讀

    嵌入式C編程常用的異常錯誤處理

    信息記錄到非易失性存儲器或通過串口輸出。 總結 嵌入式C編程中的異常錯誤處理方法多種多樣,選擇合適的方法取決于具體的應用場景和系統要求。通過合理的錯誤處理機制,可以提高系統的
    發表于 08-06 14:32

    三菱異常停止plc怎么解決

    PLC異常停止的原因 電源問題 :電源不穩定或電源故障可能導致PLC停止工作。 硬件故障 :PLC內部硬件損壞,如CPU模塊、輸入/輸出模塊等。 軟件問題 :程序錯誤或配置不當可能導致PLC異常停止。 外部干擾 :電磁干擾或機械
    的頭像 發表于 07-25 10:13 ?2471次閱讀

    Efinity debuger常見問題總結-v2

    Efinity在Debug時會出現UUID mismatch錯誤。很多剛開始使用的人經常遇到。下面我們做一個總結。歡迎遇到案例時共同分享。
    的頭像 發表于 07-11 11:39 ?2301次閱讀
    Efinity debuger常見問題<b class='flag-5'>總結</b>-v2

    安裝依賴的Python軟件包時報錯如何解決?

    安裝依賴的 Python 軟件包,出現了如下錯誤,請問如何解決,謝謝! Command \"E:/msys32/mingw32/bin/python2.7.exe E:/msys32
    發表于 06-26 07:32

    一站式統一返回值封裝、異常處理、異常錯誤碼解決方案—最強的Sping Boot接口優雅響應處理器

    1. 前言 統一返回值封裝、統一異常處理和異常錯誤碼體系的意義在于提高代碼的可維護性和可讀性,使得代碼更加健壯和穩定。統一返回值封裝可以避免每一個接口都需要手工拼裝響應報文;統一異常
    的頭像 發表于 06-20 15:42 ?647次閱讀

    EC20鏈接后經常異常關閉,+QIURC: \"pdpdeact\",1錯誤是什么原因引起的?

    EC20鏈接后經常異常關閉,+QIURC: \"pdpdeact\",1錯誤,是什么原因引起的
    發表于 04-11 06:13

    介紹一些常見的Modbus IO通信錯誤代碼及其含義

    Modbus IO通信協議中的錯誤代碼通常用于標識通信過程中出現的錯誤異常情況。
    的頭像 發表于 03-06 09:03 ?2868次閱讀
    在线百家乐博彩网| 澳门百家乐怎么赢钱| 枞阳县| 百家乐出千方法技巧| 赌百家乐官网的玩法技巧和规则 | 大发888娱乐场下载 17| 百家乐有看牌器吗| 澳门百家乐官网娱乐场开户注册| 南安市| bet365合作计划| 免费百家乐统计软件| 百家乐代理在线游戏可信吗网上哪家平台信誉好安全 | 六合彩天线宝宝| 百家乐一邱大师打法| 百家乐官网娱乐城体验金| 百家乐官网平注胜进与负追| 百家乐官网公试打法| 大发888真人网站| 百家乐黏土筹码| 百家乐彩金| 真人百家乐官网ea平台| 鸿博| 新2开户| 德州扑克概率计算器| 威尼斯人娱乐城品牌| 榆次百家乐的玩法技巧和规则 | 百家乐官网永利娱乐| 赌百家乐官网怎样能赢| 凯旋门百家乐官网技巧| 大发888下载官网| 大发888真钱娱乐场下载| 百家乐统计工具| 全讯网赢足一世| 合肥太阳城莱迪广场| 威尼斯人娱乐城安全吗| 百家乐画面| 网络百家乐证据| 24山风水实例| 百家乐注册送免费金| 百家乐的技术与心态| 打百家乐庄闲的技巧|