亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么解決Python中的異常

發布時間:2020-08-25 14:02:09 來源:億速云 閱讀:171 作者:Leah 欄目:編程語言

今天就跟大家聊聊有關怎么解決Python中的異常,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。

一、異常介紹

print("1---------------------")
open("123.txt","r")
print("2---------------------")

運行結果為:

1---------------------
Traceback (most recent call last):
  File "C:\Users\Se7eN_HOU\Desktop\demo.py", line 2, in <module>
    open("123.txt","r")
FileNotFoundError: [Errno 2] No such file or directory: '123.txt'

說明:打開一個不存在的文件123.txt,當找不到123.txt 文件時,就會拋出給我們一個IOError類型的錯誤,No such file or directory:123.txt (沒有123.txt這樣的文件或目錄)

異常:當Python檢測到一個錯誤時,解釋器就無法繼續執行了,反而出現了一些錯誤的提示,這就是所謂的”異常”。

二、捕獲異常

try…except…

try:
    print("1---------------------")
    open("123.txt","r")
    print("2---------------------")
     
except IOError:
    pass

運行結果為:

1---------------------

說明:

1.此程序看不到任何錯誤,因為用except 捕獲到了IOError異常,并添加了處理的方法。

2.pass 表示實現了相應的實現,但什么也不做;如果把pass改為print語句,那么就會輸出其他信息。

3.把可能出現問題的代碼,放在try中。

4.把處理異常的代碼,放在except中。

三、except捕獲多個異常

try:
    print(num)
except IOError:
    print("產生的錯誤")

運行結果為:

Traceback (most recent call last):
  File "C:\Users\Se7eN_HOU\Desktop\Tools\sublimetext3\Sublime Text Build 3176 x86\demo.py", line 2, in <module>
    print(num)
NameError: name 'num' is not defined

上例程序,已經使用except來捕獲異常了,為什么還會看到錯誤的信息提示?因為:except捕獲的錯誤類型是IOError,而此時程序產生的異常為 NameError ,所以except沒有生效。

修改后的代碼為:

try:
    print(num)
except NameError:
    print("產生的錯誤")

運行結果為:

產生的錯誤

實際開發中,捕獲多個異常的方式,如下:

try:
    print("1---------------------")
    open("123.txt","r")
    print("2---------------------")
    print(num)
except (IOError,NameError):
    print("產生的錯誤")

運行結果為:

1---------------------
產生的錯誤

當捕獲多個異常時,可以把要捕獲的異常的名字,放到except 后,并使用元組的方式僅進行存儲。

四、獲取異常的信息描述

try:
    print("1---------------------")
    open("123.txt","r")
    print("2---------------------")
except Exception as e:#Exception是異常類,e是捕獲到的異常
    print(e)

運行結果為:

1---------------------
[Errno 2] No such file or directory: '123.txt'

五、else

在if中,else的作用是當條件不滿足時執行的實行;同樣在try…except…中也是如此,即如果沒有捕獲到異常,那么就執行else中的事情。

try:
    num = 100
except Exception as e:#Exception是異常類,e是捕獲到的異常
    print("產生錯位了:%s"%e)
else:
    print("沒有捕獲異常,真高興")

運行結果為:

沒有捕獲異常,真高興

六、try…finally…

在程序中,如果一個段代碼必須要執行,即無論異常是否產生都要執行,那么此時就需要使用finally。 比如文件關閉,釋放鎖,把數據庫連接返還給連接池等。

import time
try:
    f = open("test.txt")
    try:
        while True:
            content = f.readline()
            if len(content) == 0:
                break
            time.sleep(2)
            print(content)
    except :
        #如果再讀取文件的過程中,產生了異常,那么就會捕獲到
        #比如 按下 ctrl + c
        pass
    finally:
        f.close()
        print("關閉文件")
except :
    print("沒有這個文件")

test.txt文件中每一行數據打印,但是我有意在每打印一行之前用time.sleep方法暫停2秒鐘。這樣做的原因是讓程序運行得慢一些。在程序運行的時候,按Ctrl+c中斷(取消)程序。

我們可以觀察到KeyboardInterrupt異常被觸發,程序退出。但是在程序退出之前,finally從句仍然被執行,把文件關閉。

七、異常的傳遞

def test1():
    print("------test1-1-------")
    print(num)
    print("------test1-2-------")
def test2():
    print("------test2-1-------")
    test1()
    print("------test2-2-------")
def test3():
    try:
        print("------test3-1-------")
        test1()
        print("------test3-2-------")
    except Exception as e:
        print("捕獲到了異常,信息是:%s"%e)
test3()
print("--------------------------------------")
test2()

運行結果為:

------test3-1-------
------test1-1-------
捕獲到了異常,信息是:name 'num' is not defined
--------------------------------------
------test2-1-------
------test1-1-------
Traceback (most recent call last):
  File "C:\Users\Se7eN_HOU\Desktop\Tools\sublimetext3\Sublime Text Build 3176 x86\demo.py", line 21, in <module>
    test2()
  File "C:\Users\Se7eN_HOU\Desktop\Tools\sublimetext3\Sublime Text Build 3176 x86\demo.py", line 8, in test2
    test1()
  File "C:\Users\Se7eN_HOU\Desktop\Tools\sublimetext3\Sublime Text Build 3176 x86\demo.py", line 3, in test1
    print(num)
NameError: name 'num' is not defined

如果try嵌套,那么如果里面的try沒有捕獲到這個異常,那么外面的try會接收到這個異常,然后進行處理,如果外邊的try依然沒有捕獲到,那么再進行傳遞。。。

如果一個異常是在一個函數中產生的,例如函數A—->函數B—->函數C,而異常是在函數C中產生的,那么如果函數C中沒有對這個異常進行處理,那么這個異常會傳遞到函數B中,如果函數B有異常處理那么就會按照函數B的處理方式進行執行;如果函數B也沒有異常處理,那么這個異常會繼續傳遞,以此類推。。。如果所有的函數都沒有處理,那么此時就會進行異常的默認處理,即通常見到的那樣。

注意觀察上圖中,當調用test3函數時,在test1函數內部產生了異常,此異常被傳遞到test3函數中完成了異常處理,而當異常處理完后,并沒有返回到函數test1中進行執行,而是在函數test3中繼續執行。

八、拋出自定義的異常

用raise語句來引發一個異常。異常/錯誤對象必須有一個名字,且它們應是Error或Exception類的子類。

class ShortInputException(Exception):
    def __init__(self,length,atleast):
        self.length = length
        self.atleast = atleast
def main():
    try:
        s = input("請輸入:")
        if len(s)<3:
            raise ShortInputException(len(s),3)
    except ShortInputException as e:
        print("ShortInputException:輸入的長度是%d,長度至少是%d"%(e.length,e.atleast))
    else:
        print("沒有發生異常")
main()

運行結果為:

請輸入:qw
ShortInputException:輸入的長度是2,長度至少是3
請輸入:qwert
沒有發生異常

看完上述內容,你們對怎么解決Python中的異常有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

松原市| 龙岩市| 辽阳县| 化德县| 德昌县| 吉木萨尔县| 阜南县| 铜陵市| 五大连池市| 东丰县| 探索| 安康市| 息烽县| 平和县| 宝坻区| 揭阳市| 东平县| 盐池县| 商河县| 乌拉特前旗| 镇远县| 甘南县| 桂阳县| 马关县| 阿坝| 繁峙县| 邵东县| 岗巴县| 温泉县| 丰台区| 南开区| 札达县| 临泽县| 琼结县| 江口县| 柘城县| 延寿县| 盐池县| 楚雄市| 成都市| 奎屯市|