python異常處理_Python入門 斷言與異常處理

一、斷言

斷言,可以理解為判斷是否斷開的預言。

assert  表達式 , 描述

表達式為我們的預期結果,當表達式的結果為False時,拋出 AssertionError 異常,如無異常捕獲程序遇到異常時直接結束運行。反之,表達式結果為True 程序繼續向下運行。

我們何時使用斷言?

斷言需要慎用,尤其是寫測試用例或者程序時,因為我們運行程序時,如果斷言失敗,無異常捕獲程序則會結束運行,導致后面的代碼無法執行。

斷言一般用在防御型的編程、運行時檢查程序邏輯、檢查約定、程序常量、檢查文檔時,在從來不會運行失敗的代碼不必要加上斷言。

示例1.1:當pi值對修改拋出異常

class 

輸出結果:

Traceback (most recent call last):assert self.pi == Circle.pi, 'pi 值被修改'
AssertionError: pi 值被修改

示例1.2:

assert 

二、語法錯誤與異常的區別

語法錯誤:或者稱之為解析錯,程序無法解析或者編譯

1、語法錯誤:代碼不符合解釋器或編譯器的語法,如:print()輸出單詞出錯

2、邏輯錯誤:不完成或者不合法的輸入或者計算機出問題,如:死循環

異常:執行過程中出現問題導致程序無法執行

1、程序遇到邏輯或者算法問題,如:1/0

2、運行過程中計算機錯誤,如:內存不夠或者IO錯誤

異常出現的過程:

1、異常產生,檢查到錯誤且解釋器認為是異常,拋出異常

2、異常處理,截獲異常,忽略或者終止程序處理異常

總結:異常都可以是錯誤,但是錯誤不一定是異常

三、異常

運行期間檢測到的錯誤被稱為異常,大多數的異常都不會被程序處理,都以錯誤信息的形式展現。

如下:

>>>1/0
Traceback (most recent call last):File "<input>", line 1, in <module>
ZeroDivisionError: division by zero
>>>4+a*5
Traceback (most recent call last):File "<input>", line 1, in <module>
NameError: name 'a' is not defined
>>>'2'+2
Traceback (most recent call last):File "<input>", line 1, in <module>
TypeError: Can't convert 'int' object to str implicitly

異常以不同的類型出現,這些類型都作為信息的一部分打印出來。如上面例子中的類型有ZeroDivisionError,NameError 和 TypeError異常。

錯誤信息的前面部分顯示了異常發生的上下文,并以調用棧的形式顯示具體信息。

Python中常見的異常

37d3697e3d799971f18003df9e08b53e.png
常見異常

四、異常處理 try...except...else...finally...

怎么捕獲異常,并處理?

我們捕獲異常使用 try ... except ...,try 與 except 之間是可能會發生異常的語句塊,而 except 下的語句塊是當異常發生后我們進行處理的語句塊。

示例 4.1:

while 

運行程序:

接收一個除數:1
2.0
接收一個除數:0
發生了異常
接收一個除數:2a
發生了異常

如上,當我們輸入0發生了異常,輸入2a也發生了異常,因為int()無法將2a轉換為int,而且兩種異常類類型不同。

怎么捕獲特定的異常?

在 except 后加入異常類型,就可以捕獲特定的異常,也可以一次性捕獲多個異常,如下示例4.2

示例4.2:

while 

運行程序:

接收一個除數:0
發生了ZeroDivisionError異常
接收一個除數:a
發生了ValueError或KeyboardInterrupt或TypeError異常

except 后語句只在發生異常后才執行,那么有沒有當異常沒有發生時我們才進行處理的語句?

有,try ... except ... else ...,else 后的語句塊是當異常沒有發生后才會執行。

示例4.3:

while 

運行程序:

接收一個除數:0
發生了ZeroDivisionError異常
接收一個除數:1
2.0
結束程序運行

如上運行結果,else只有在沒有發生異常的時候運行。

異常發生可以處理,異常沒發生也可以處理,那么有沒有不管是否發生異常都進行處理的語句?

有try ... except ... finally ...,finally 下的語句塊不管有沒有發生異常都會執行。

示例4.4:

while 

運行程序:

接收一個除數:1
2.0
執行了finally語句塊
接收一個除數:0
發生了ZeroDivisionError異常
執行了finally語句塊

如上 finally 下的語句塊,不管有沒有出現異常都會執行。

try ... except ... else ... finally ... 的使用順序

try ... except ... else ... finally...使用順序,else 必須在 except 后 finally 前,finally 只能在最后;else 與 finally 可有可無。

語法上 except 也可以缺少,不過少了except就不能捕獲異常,沒人會這樣寫代碼。

try

五、拋出異常 raise

Python 可以使用 raise 語句拋出一個指定的異常

raise 

raise 唯一的一個參數是指定要被拋出的異常。它必須是一個異常的實例或者是異常的類(也就是 Exception 的子類)。

示例:

raise 

輸出結果:

Traceback (most recent call last):raise NameError('使用一個還未賦值對象的變量')
NameError: 使用一個還未賦值對象的變量

try ... except ... finally ... 使用場景

try ... except ... finally ... 是非常常用,主要用于如關閉數據庫連接,文件關閉,釋放線程鎖等。

fo 

附件:異常類列表

來自官方文檔:5. Built-in Exceptions

BaseException+-- SystemExit+-- KeyboardInterrupt+-- GeneratorExit+-- Exception+-- StopIteration+-- StopAsyncIteration+-- ArithmeticError|    +-- FloatingPointError|    +-- OverflowError|    +-- ZeroDivisionError+-- AssertionError+-- AttributeError+-- BufferError+-- EOFError+-- ImportError+-- ModuleNotFoundError+-- LookupError|    +-- IndexError|    +-- KeyError+-- MemoryError+-- NameError|    +-- UnboundLocalError+-- OSError|    +-- BlockingIOError|    +-- ChildProcessError|    +-- ConnectionError|    |    +-- BrokenPipeError|    |    +-- ConnectionAbortedError|    |    +-- ConnectionRefusedError|    |    +-- ConnectionResetError|    +-- FileExistsError|    +-- FileNotFoundError|    +-- InterruptedError|    +-- IsADirectoryError|    +-- NotADirectoryError|    +-- PermissionError|    +-- ProcessLookupError|    +-- TimeoutError+-- ReferenceError+-- RuntimeError|    +-- NotImplementedError|    +-- RecursionError+-- SyntaxError|    +-- IndentationError|         +-- TabError+-- SystemError+-- TypeError+-- ValueError|    +-- UnicodeError|         +-- UnicodeDecodeError|         +-- UnicodeEncodeError|         +-- UnicodeTranslateError+-- Warning+-- DeprecationWarning+-- PendingDeprecationWarning+-- RuntimeWarning+-- SyntaxWarning+-- UserWarning+-- FutureWarning+-- ImportWarning+-- UnicodeWarning+-- BytesWarning+-- ResourceWarning

2020年4月16日,第一次更新,優化內容

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/446331.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/446331.shtml
英文地址,請注明出處:http://en.pswp.cn/news/446331.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C++ 左值和右值 的學習

引用是一個變量&#xff0c;它引用其他變量的內存位置 int x 34; int &lRef x; 標識符 IRef 就是一個引用。在聲明中&#xff0c;引用是通過 & 來指示的&#xff0c;出現在類型與變量的標識符之間&#xff0c;這種類型的引用稱為左值引用左值看作是一個關聯了名稱的…

百度關鍵詞排名查詢源碼_章丘百度霸屏總部,關鍵詞排名騰沃云

上海保沃騰沃云為您詳細解讀URiIr章丘百度霸屏總部的相關知識與詳情&#xff0c;做網站SEO優化文章內容優化效果已經十分明顯。內容的量量關于網站的整體量量很重要。通過關鍵字闡發&#xff0c;陳某們曉得需要環繞關鍵字編寫網頁。使您的內容的重要根底是您對網頁籌算描述的賣…

java 結婚問題

題目 大家都知道&#xff0c;男大當婚&#xff0c;女大當嫁。那么女方家長要嫁女兒&#xff0c;當然要提出 一定的條件&#xff1a;高&#xff1a;180cm以上&#xff1b;富&#xff1a;財富1千萬以上&#xff1b;帥&#xff1a;是。 如果這三個條件同時滿足&#xff0c;則&…

密碼學專題 數據填充的方式|序列加密的方式

電子密碼本模式和加密分組鏈接模式的分組算法都要求加密輸入的分組是固定長度 的&#xff0c;但是大多數輸入明文可能都不是分組長度的整數倍&#xff0c;也就是說&#xff0c;最后一個分組一般來 說是不足一個分組長度的。為了使分組加密算法能夠正常工作&#xff0c;通常使用…

win10此電腦不見了_教程 | win10總提示“你要允許此應用對電腦的修改嗎”,如何關閉?...

在使用電腦的時候&#xff0c;你是否曾遇到過這樣的情況&#xff0c;點擊打開軟件的時候&#xff0c;系統總是提示我們“你要允許此應用對你的設備進行修改嗎&#xff1f;”難道是軟件中病毒了嗎&#xff1f;&#xff0c;這其實上并沒有什么用處&#xff0c;只是系統無法判斷軟…

java 小時轉換為xx天xx小時

題目 為抵抗洪水&#xff0c;戰士連續作戰89小時&#xff0c;編程計算共多少天零多少小時&#xff1f; 代碼 使用/與% class ExchangeTime {public static void main(String[] args) {/*為抵抗洪水&#xff0c;戰士連續作戰89小時&#xff0c;編程計算共多少天零多少小時&a…

密碼學專題 加密模式的選擇|傳輸數據加密

分組加密模式和序列加密模式。它們之間最大的區 別在于分組加密模式每次對一組數據進行加密運算處理&#xff0c;而序列加密模式則逐位對數據進 行加密運算處理。事實上&#xff0c;在實際設計應用的算法中&#xff0c;并沒有那么嚴格的區別&#xff0c;它們有可能是相互結合的…

微信公眾號數據2019_2019年9月原創公眾號排行榜數據報告出爐

西瓜數據發布 2019 年 9 月原創公眾號排行榜&#xff0c;分別從西瓜指數、原創文章占比、周期內公眾號發文次數、發文篇數、總閱讀數、頭條平均閱讀數等方面展示公眾號數據。榜單說明1、涉及榜單本期月榜截取 ①財經、②教育、③娛樂、④科技、⑤體育、⑥游戲、⑦文化、⑧美食、…

java 求100天之后是周幾

題目 今天是周二&#xff0c;100天以后是周幾&#xff1f; 代碼 代碼1&#xff1a;減去天數&#xff0c;使循環從周一開始 //方法1&#xff1a;減去天數&#xff0c;使循環從周一開始int today2;//7天一個循環&#xff1a;3 4 5 6 7 1 2 3 4 5 6 7int after100;//(100-5)%…

密碼學專題 OpenSSL專題

OpenSSL總體架構 軟件包分為三個主要的功能部分&#xff1a;密碼算法庫 、 SSL協議庫及應用程序 MacOS&#xff0c;MS&#xff0c;OS/2及 VMS這幾個目錄&#xff0c;包含了在不同的 平臺編譯時的環境變量配置文件&#xff0c;在安裝編譯完成之后&#xff0c;這幾個目錄就沒有作…

java 華氏溫度轉換為攝氏溫度

題目 小明要到美國旅游&#xff0c;可是那里的溫度是以華氏度為單位記錄的。 它需要一個程序將華氏溫度&#xff08;80度&#xff09;轉換為攝氏度&#xff0c;并以華氏度和攝氏度為單位分別顯示該溫度。 公式&#xff1a;華氏溫度&#xff08;攝氏溫度-32&#xff09;/1.8 M…

hs控什么意思_凡爾賽文學 到底是什么?

點擊藍字關注我們XIE XIE NI DE XI HUAN|| 動漫 情頭 耽美 閨蜜 男女頭 句子控 壁紙 ||左句 凡爾賽文學野象&#xff1a;老是有人提知不知道凡爾賽文學&#xff0c;說實話我不太清楚網絡時下流行的梗&#xff0c;也沒有興趣參與&#xff0c;我還是比較喜歡歐洲古典文學和后現…

密碼學專題 openssl編譯和安裝

Configure 腳本文件 使得OpenSSL可以適應多種不同的系統平臺和多達幾十種不同的編譯器。Configure指令還可以使OpenSSL在編譯的時候具備組件的選擇功能&#xff0c;比如可以選擇支持或者不支持某種算法或者協議等&#xff0c;這使得OpenSSL具有很大的靈活性&#xff0c;比如在…

Python學習12 文件的讀寫

目標 文件的打開和關閉 mode缺省情況下表示只讀r 文件的路徑 前面加個r’,代表其中的轉義字符不起作用 文件的打開方式 案例&#xff1a;實現文件拷貝的功能 將某一文件夾下的某一文件 保存在當前文件 所在目錄。 import os #讀取文件1 path./file.txt fileopen(path,…

密碼學專題 openssl的基本概念

配置文件 配置文件是OpenSSL的一個基礎結構組件&#xff0c;OpenSSL使用一組稱為OpenSSLCONF的函數來讀取OpenSSL配置文件的信息。OpenSSL提供的主配置文件是opensl.cnf&#xff0c;它集成了OpenSSL所要使用的配置文件選項的大部分內容。此外&#xff0c;OpenSSL還提供了其他一…

該工程中的宏被禁止_建筑勞務分包都能承擔什么工程

來源&#xff1a;找法網建筑工程的承包單位&#xff0c;也就是總承包單位可以將部分建造工程分包給具有資質的施工單位&#xff0c;這是法律所允許的&#xff0c;但是禁止將建造工程進行轉包。一、建筑勞務分包都能承擔什么工程建筑勞務分包能承擔什么工程要看分包單位的資質&a…

python實驗練習-類的多繼承

題目 1、概述&#xff1a; 完成學生&#xff0c;組長&#xff0c;教師的設計與實現。 2、具體實現內容&#xff1a; 學生&#xff1a; 姓名&#xff0c; 年齡&#xff0c; 學號 吃飯&#xff0c; 睡覺&#xff0c; 學習 組長&#xff1a; 姓名&#xff0c; 年齡&#xff0c; 學…

matlab用辛普森公式求積分_積分近似計算之辛普森公式

對于積分區間[a, b]&#xff0c;若則成立辛普森公式辛普森公式可看作是改良的梯形公式。梯形公式是以直線逼近實際曲線&#xff0c;而辛普森公式則以二次曲線(即拋物線)逼近。以二次曲線逼近實際曲線根據辛普森公式可得各積分小區間內的積分值如下式所示&#xff1a;其中于是&a…

密碼學專題 文件編碼格式

OpenSSL中雖然使用PEM作為基本的文件編碼格式&#xff0c;但是&#xff0c;由于不同的對象其封裝的標準格式不太一樣&#xff0c;所以經常會導致讀者產生迷惑。此外&#xff0c;OpenSSL也支持DER編碼和過時的Netscape編碼格式(NET)OpenSSL的編碼是基于ASN.1標準的&#xff0c;A…

python實驗練習-圖書管理系統(使用文件來實現)

題目 功能描述&#xff1a; 圖書管理系統項目功能描述&#xff1a; &#xff08;1&#xff09;創建txt文本文檔&#xff0c;包含如下&#xff1a; ① books.txt&#xff1a;保存有一些書籍名稱&#xff1b; ② users.txt&#xff1a;用于保存用戶相關的信息&#xff1b; ③ us…