欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

關于Python的異常捕獲和處理

 更新時間:2023年04月22日 14:32:07   作者:瘋狂創(chuàng)作者  
程序在運行過程當中,不可避免的會出現(xiàn)一些錯誤,比如:使用了沒有賦值過的變量,使用了不存在的索引,一個數(shù)字除以0,這些錯誤在程序中,我們稱其為異常,那么如何處理這些異常呢,今天我們就來看一看

 程序運行過程中,一旦出現(xiàn)異常將會導致程序立即終止,異常以后的代碼全部都不會執(zhí)行!

1 | 語法錯誤

指解析代碼時出現(xiàn)的錯誤。當代碼不符合Python 語法規(guī)則時,Python解釋器在解析時就會報出 SyntaxError 語法錯誤,與此同時還會明確指出最早探測到錯誤的語句。例如:

print "Hello,World!"

我們知道,Python 3.0已不再支持上面這種寫法,所以在運行時,解釋器會報如下錯誤:

SyntaxError: Missing parentheses in call to 'print'

語法錯誤多是開發(fā)者疏忽導致的,屬于真正意義上的錯誤,是解釋器無法容忍的,因此,只有將程序中的所有語法錯誤全部糾正,程序才能執(zhí)行。

2 | 運行時錯誤

運行時錯誤,即程序在語法上都是正確的,但在運行時發(fā)生了錯誤。例如:

a = 1/0

上面這句代碼的意思是“用 1 除以 0,并賦值給 a 。因為0 作除數(shù)是沒有意義的,所以運行后會產(chǎn)生如下錯誤:

Traceback (most recent call last): File "<pyshell#0>", line 1, in <module> 1/0 ZeroDivisionError: division by zero

3 |其他異常

以上運行輸出結果中,前兩段指明了錯誤的位置,最后一句表示出錯的類型。在 Python 中,把這種運行時產(chǎn)生錯誤的情況叫做異常(Exceptions)

這種異常情況還有很多,常見的幾種異常情況如下表:

異常類型含義實例
AssertionError當 assert 關鍵字后的條件為假時,程序運行會停止并拋出此異常

>>> assert 1>0

>>> assert 1<0

AssertionError

AttributeError當試圖訪問的對象屬性不存在時,拋出的異常

>>> s="hello"

>>> s.len

AttributeError: 'str' object has no attribute'len'

IndexError索引超出序列范圍,會引發(fā)此異常

>>> s="hello"

>>> s[5]

IndexError: string index out of range

KeyError字典中查找一個不存在的關鍵字時,引發(fā)此異常

>>> demo_dict={"age": 20}

>>> demo_dict["name"]

KeyError: 'name'

NameError嘗試訪問一個未聲明的變量時,引發(fā)此異常

>>> hello

NameError: name 'hello' is not defined

TypeError不同類型數(shù)據(jù)之間的無效操作

>>> 1+"2"

TypeError: unsupported operand type(s) for +: 'int' and 'str'

ZeroDivisionError除法運算中除數(shù)為 0 引發(fā)此異常

>>> a = 1/0

ZeroDivisionError: division by zero

4 | 異常處理

程序運行時出現(xiàn)異常,目的并不是讓我們的程序直接終止!Python是希望在出現(xiàn)異常時,我們可以編寫代碼來對異常進行處理!

Python 提供了try except語句捕獲并處理異常,該異常處理語句的基本語法結構如下:

try:
    # 可能產(chǎn)生異常的代碼塊
except [(Error1, Error2, ...) [as e]]:
    # 處理異常的代碼塊1
except [(Error3, Error4, ...) [as e]]:
    # 處理異常的代碼塊2

該格式中,[ ] 括起來的部分可以使用,也可以省略。其中各部分的含義如下:

  • (Error1, Error2,...) 、(Error3, Error4,...):其中,Error1、Error2、Error3 和Error4 都是具體的異常類型。顯然,一個 except 塊可以同時處理多種異常。
  • [as e]:作為可選參數(shù),表示給異常類型起一個別名 e,這樣做的好處是方便在except 塊中調(diào)用異常類型(后續(xù)會用到)。
  • [Exception]:作為可選參數(shù),可以代指程序可能發(fā)生的所有異常情況,其通常用在最后一個 except 塊。
  • 注:except 后面也可以不指定具體的異常名稱,這樣的話,表示要捕獲所有類型的異常。

另外,從 try except 的基本語法格式可以看出,try 代碼塊僅有一個,但except 代碼塊可以有多個,這是為了針對不同的異常類型提供不同的異常處理方式。當程序發(fā)生不同的意外情況時,會對應不同的異常類型,Python 解釋器就會根據(jù)該異常類型來決定使用哪個 except 塊來處理該異常。

try except 語句的執(zhí)行流程如下:

1、首先執(zhí)行 try 中的代碼塊,如果執(zhí)行過程中出現(xiàn)異常,系統(tǒng)會自動生成一個異常類型,并將該異常提交給 Python 解釋器,此過程稱為捕獲異常。

2、當 Python 解釋器收到異常對象時,會尋找能處理該異常對象的 except 塊,如果找到合適的 except 塊,則把該異常對象交給該 except 塊處理,這個過程被稱為處理異常。如果 Python 解釋器找不到處理異常的 except 塊,則程序運行終止,Python 解釋器也將退出。

異常處理例子:

try:
    a = int(input("輸入被除數(shù):"))
    b = int(input("輸入除數(shù):"))
    c = a / b
    print("您輸入的兩個數(shù)相除的結果是:", c )
except (ValueError, ArithmeticError):
    print("程序發(fā)生了數(shù)字格式異常、算術異常之一")
except :
    print("未知異常")
print("程序繼續(xù)運行")

程序運行結果為:

輸入被除數(shù):a程序發(fā)生了數(shù)字格式異常,算術異常之一程序繼續(xù)運行

上面程序中,第 6 行代碼使用了(ValueError, ArithmeticError)來指定所捕獲的異常類型,這就表明該 except 塊可以同時捕獲這 2 種類型的異常;第 8 行代碼只有 except 關鍵字,并未指定具體要捕獲的異常類型,這種省略異常類的 except 語句也是合法的,它表示可捕獲所有類型的異常,一般會作為異常捕獲的最后一個 except 塊。除此之外,由于 try 塊中引發(fā)了異常,并被 except 塊成功捕獲,因此程序才可以繼續(xù)執(zhí)行,才有了“程序繼續(xù)運行”的輸出結果。

通過在try塊后提供多個except塊可以無須在異常處理塊中使用if判斷異常類型,但依然可以針對不同的異常類型提供相應的處理邏輯,從而提供更細致、更有條理的異常處理邏輯。

事實上,不管程序代碼塊是否處于 try 塊中,甚至包括 except 塊中的代碼,只要執(zhí)行該代碼塊時出現(xiàn)了異常,系統(tǒng)總會自動生成一個 Error 對象。如果程序沒有為這段代碼定義任何的 except 塊,則 Python 解釋器無法找到處理該異常的 except 塊,程序就會停止運行;反之,如果程序發(fā)生異常,并且該異常經(jīng) try 捕獲并由 except 處理完成,則程序會繼續(xù)執(zhí)行。

5 | 獲取特定異常的有關信息

每種異常類型都提供了如下幾個屬性和方法,通過調(diào)用它們,就可以獲取當前處理異常類型的相關信息:

  • args:返回異常的錯誤編號和描述字符串;
  • str(e):返回異常信息,但不包括異常信息的類型;
  • repr(e):返回較全的異常信息,包括異常信息的類型。
try:
    result=20/int(input("請輸入除數(shù):"))
    print(result)
except ValueError:
  print("必須輸入整數(shù)")
except ArithmeticError:
  print("算數(shù)錯誤,除數(shù)不能為 0")
else:
    print("沒有出現(xiàn)異常")
print("繼續(xù)運行")

程序運行結果為:

輸入被除數(shù):210沒有出現(xiàn)異常繼續(xù)運行

6 |finally語句

Python 異常處理機制還提供了一個 finally 語句,用來為 try 塊中的程序做掃尾清理工作。

在整個異常處理機制中,finally 語句的功能是:無論 try 塊是否發(fā)生異常,最終都要進入 finally 語句,并執(zhí)行其中的代碼塊。

finally 示例:

try:
    a=20/int(input("請輸入 a 的值:"))
    print(a)
except:
  print("發(fā)生異常")
else:
  print("執(zhí)行 else 代碼塊")
finally:
    print("執(zhí)行 finally 代碼塊")

finally 代碼塊的強大還遠不止此,即便當 try 塊發(fā)生異常,且沒有合適和except 處理異常時,finally 塊中的代碼也會得到執(zhí)行。

到此這篇關于關于Python的異常捕獲和處理的文章就介紹到這了,更多相關Python異常捕獲處理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • python常用request庫與lxml庫操作方法整理總結

    python常用request庫與lxml庫操作方法整理總結

    一路學習,一路總結,技術就是這樣,應用之后,在進行整理,才可以加深印象。本篇文字為小節(jié)篇,核心總結 requests 庫與 lxml 庫常用的操作
    2021-08-08
  • Python md5與sha1加密算法用法分析

    Python md5與sha1加密算法用法分析

    這篇文章主要介紹了Python md5與sha1加密算法,簡單介紹了md5級sha1加密算法的概念、原理,并結合實例形式分析了Python使用hashlib模塊實現(xiàn)加密功能的具體操作技巧,需要的朋友可以參考下
    2017-07-07
  • python 動態(tài)生成變量名以及動態(tài)獲取變量的變量名方法

    python 動態(tài)生成變量名以及動態(tài)獲取變量的變量名方法

    今天小編就為大家分享一篇python 動態(tài)生成變量名以及動態(tài)獲取變量的變量名方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-01-01
  • Python+redis通過限流保護高并發(fā)系統(tǒng)

    Python+redis通過限流保護高并發(fā)系統(tǒng)

    這篇文章主要介紹了Python+redis通過限流保護高并發(fā)系統(tǒng),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-04-04
  • PyCharm+PySpark遠程調(diào)試的環(huán)境配置的方法

    PyCharm+PySpark遠程調(diào)試的環(huán)境配置的方法

    今天小編就為大家分享一篇PyCharm+PySpark遠程調(diào)試的環(huán)境配置的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-11-11
  • 顯卡驅(qū)動CUDA?和?pytorch?CUDA?之間的區(qū)別

    顯卡驅(qū)動CUDA?和?pytorch?CUDA?之間的區(qū)別

    本文主要介紹了顯卡驅(qū)動CUDA?和?pytorch?CUDA?之間的區(qū)別,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-03-03
  • python中torch可以成功引用但無法訪問屬性的解決辦法

    python中torch可以成功引用但無法訪問屬性的解決辦法

    這篇文章給大家介紹了我們在python中運行程序時遇到一個奇怪的報錯,torch可以成功引用但無法訪問屬性,這是比較奇怪的一件事,因為torch肯定是可以訪問Tensor,所以本文給大家介紹了torch可以成功引用但無法訪問屬性的解決辦法,需要的朋友可以參考下
    2024-01-01
  • Python count()函數(shù)實例詳解

    Python count()函數(shù)實例詳解

    count() 是Python的內(nèi)置函數(shù),可以「統(tǒng)計」字符串里指定「字符」或指定字符串出現(xiàn)的「次數(shù)」,這篇文章主要介紹了Python count()函數(shù)詳解,需要的朋友可以參考下
    2023-07-07
  • 對numpy.append()里的axis的用法詳解

    對numpy.append()里的axis的用法詳解

    今天小編就為大家分享一篇對numpy.append()里的axis的用法詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-06-06
  • python實現(xiàn)八大排序算法(1)

    python實現(xiàn)八大排序算法(1)

    這篇文章主要為大家詳細介紹了python實現(xiàn)八大排序算法的第一篇,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-09-09

最新評論