成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專(zhuān)欄INFORMATION COLUMN

Python 3 學(xué)習(xí)筆記之——錯(cuò)誤和異常

techstay / 2190人閱讀

摘要:異常即使程序的語(yǔ)法是正確的,但是在運(yùn)行的時(shí)候,也有可能發(fā)生錯(cuò)誤,運(yùn)行期監(jiān)測(cè)到的錯(cuò)誤稱為異常。此時(shí)可以打印出錯(cuò)誤信息,然后再次把異常拋出。這個(gè)子句將在子句沒(méi)有發(fā)生任何異常的時(shí)候執(zhí)行。異常類(lèi)繼承自,可以直接繼承,或者間接繼承。

1. 語(yǔ)法錯(cuò)誤
Python 的語(yǔ)法錯(cuò)誤被稱為解析錯(cuò),語(yǔ)法分析器會(huì)指出出錯(cuò)的代碼行,并且在最先找到的錯(cuò)誤的位置標(biāo)記一個(gè)小小的箭頭。
>>> while True 
  File "", line 1
    while True 
              ^
SyntaxError: invalid syntax
2. 異常
即使 Python 程序的語(yǔ)法是正確的,但是在運(yùn)行的時(shí)候,也有可能發(fā)生錯(cuò)誤,運(yùn)行期監(jiān)測(cè)到的錯(cuò)誤稱為異常。
>>> print(name)
Traceback (most recent call last):
  File "", line 1, in 
NameError: name "name" is not defined

>>> a = [1, 2, 3]
>>> b = a(0)
Traceback (most recent call last):
  File "", line 1, in 
TypeError: "list" object is not callable

>>> 10 / 0
Traceback (most recent call last):
  File "", line 1, in 
ZeroDivisionError: division by zero
3. 異常處理

try 語(yǔ)句按照以下方式工作:

首先,執(zhí)行 try 子句,也就是在 try 和 except 之間的語(yǔ)句

如果沒(méi)有異常發(fā)生,忽略 except 子句,程序繼續(xù)運(yùn)行

如果在 try 子句執(zhí)行過(guò)程中發(fā)生了異常,那么 try 子句余下的部分將被忽略

若異常的類(lèi)型和 except 之后的名稱相符,那么對(duì)應(yīng)的 except 子句將被執(zhí)行,然后再執(zhí)行 try 語(yǔ)句之后的代碼

若異常沒(méi)有與任何的 except 匹配,那么這個(gè)異常將會(huì)傳遞到上層的 try 中去

while True:
    try:
        x = int(input("Please enter a number: "))
        break
    except ValueError:
        print("Oops!  That was no valid number.  Try again!")

Please enter a number: we
Oops!  That was no valid number.  Try again!
Please enter a number: sd
Oops!  That was no valid number.  Try again!
Please enter a number: 23

在上面的例子中,我們讓用戶通過(guò)鍵盤(pán)來(lái)輸入一個(gè)合法的整數(shù)。如果輸入的是字符串,那 int 函數(shù)就無(wú)法將字符串轉(zhuǎn)為整數(shù),程序就會(huì)拋出一個(gè)異常,然后執(zhí)行 except 子句,打印信息提示我們重新輸入,直到輸入一個(gè)整數(shù)程序 break 結(jié)束。

一個(gè) except 子句可以同時(shí)處理多個(gè)異常,這些異常被放在一個(gè)括號(hào)里成為一個(gè)元組。

except (RuntimeError, TypeError, NameError):
    pass

最后一個(gè) except 子句可以忽略異常的名稱,它將被當(dāng)做通配符使用。此時(shí)可以打印出錯(cuò)誤信息,然后再次把異常拋出。

import sys

try:
    f = open("test.txt")
    s = f.readline()
    i = int(s.strip())
except OSError as err:
    print("OS error: {0}".format(err))
except ValueError:
    print("Could not convert data to an integer.")
except:
    print("Unexpected error:", sys.exc_info()[0])
    raise

# 沒(méi)有相應(yīng)文件時(shí)報(bào)錯(cuò)
OS error: [Errno 2] No such file or directory: "test.txt"

# 文件中第一行為字符串無(wú)法轉(zhuǎn)化為整數(shù)時(shí)報(bào)錯(cuò)
Could not convert data to an integer.

try except 語(yǔ)句還有一個(gè)可選的 else 子句,如果使用這個(gè)子句,那么必須放在所有的 except 子句之后。這個(gè)子句將在try子句沒(méi)有發(fā)生任何異常的時(shí)候執(zhí)行。

import sys

try:
    f = open("test.txt")
    s = f.readline()
    i = int(s.strip())
except OSError as err:
    print("OS error: {0}".format(err))
except ValueError:
    print("Could not convert data to an integer.")
except:
    print("Unexpected error:", sys.exc_info()[0])
    raise

else:
    print(i)

# 1

使用 else 子句比把所有語(yǔ)句都放在 try 子句里面要好,這樣可以避免一些意想不到的而 except 又沒(méi)有捕獲到的異常。

異常處理也可以處理子句中調(diào)用函數(shù)甚至是間接調(diào)用函數(shù)里拋出的異常。

3. 用戶自定義異常

我們可以通過(guò)創(chuàng)建一個(gè)新的異常類(lèi)來(lái)?yè)碛凶约旱漠惓?。異常?lèi)繼承自 Exception,可以直接繼承,或者間接繼承。

class MyError(Exception):
    
    def __init__(self, value):
        self.value = value
    def __str__(self):
        return repr(self.value)

try:
    raise MyError(2*2)
except MyError as e:
    print("My exception occurred, value:", e.value)

# My exception occurred, value: 4
4. 定義清理行為

try 語(yǔ)句還有另外一個(gè)可選的子句 finally,它定義了無(wú)論任何情況下都會(huì)執(zhí)行的清理行為。

def divide(x, y):
    try:
        result = x / y
    except ZeroDivisionError:
        print("division by zero!")
    else:
        print("result is", result)
    finally:
        print("executing finally clause")
   
divide(2, 1)
result is 2.0
executing finally clause

divide(2, 0)
division by zero!
executing finally clause
divide("2", "1")
executing finally clause

TypeError     Traceback (most recent call last)
 in ()
----> 1 divide("2", "1")

 in divide(x, y)
      1 def divide(x, y):
      2     try:
----> 3         result = x / y
      4     except ZeroDivisionError:
      5         print("division by zero!")

TypeError: unsupported operand type(s) for /: "str" and "str"

一些對(duì)象定義了標(biāo)準(zhǔn)的清理行為,當(dāng)程序中不需要它的時(shí)候,那么這個(gè)標(biāo)準(zhǔn)行為就會(huì)執(zhí)行。關(guān)鍵詞 with 語(yǔ)句可以保證諸如文件之類(lèi)的對(duì)象在使用完之后一定會(huì)正確=地執(zhí)行清理行為。

參考資料 菜鳥(niǎo)教程

獲取更多精彩,請(qǐng)關(guān)注「seniusen」!

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/44878.html

相關(guān)文章

  • Laravel學(xué)習(xí)筆記Errors Tracking神器——Sentry

    摘要:中異常處理類(lèi)主要包含兩個(gè)方法和,其中就是主要用來(lái)向第三方發(fā)送異常報(bào)告,這里選擇向這個(gè)神器發(fā)送異常報(bào)告,并使用通知開(kāi)發(fā)人員。通過(guò)也能發(fā)現(xiàn)的執(zhí)行流程。 說(shuō)明:Laravel學(xué)習(xí)筆記之bootstrap源碼解析中聊異常處理時(shí)提到過(guò)Sentry這個(gè)神器,并打算以后聊聊這款神器,本文主要就介紹這款Errors Tracking神器Sentry,Sentry官網(wǎng)有一句話個(gè)人覺(jué)得帥呆了: Stop ...

    xiguadada 評(píng)論0 收藏0
  • 從JavaScript到Python異常

    摘要:但如果忽視異常輕則影響功能運(yùn)行,重則導(dǎo)致系統(tǒng)崩潰,造成經(jīng)濟(jì)損失。異常處理捕獲異常捕獲關(guān)鍵字與一致,都是使用。語(yǔ)句塊表示無(wú)論是否發(fā)生異常,語(yǔ)句塊代碼一定會(huì)被執(zhí)行。 不少前端工程師看到這個(gè)標(biāo)題可能會(huì)產(chǎn)生質(zhì)問(wèn): 我js用得好好的,能后端能APP,為什么還要學(xué)習(xí)Python? 至少有下面兩個(gè)理由: 學(xué)習(xí)曲線。ES6之后的JavaScript(TypeScript)的在語(yǔ)法上和Python有很...

    xcold 評(píng)論0 收藏0
  • 編程書(shū)單:十本Python編程語(yǔ)言的入門(mén)書(shū)籍

    摘要:本文與大家分享一些編程語(yǔ)言的入門(mén)書(shū)籍,其中不乏經(jīng)典。全書(shū)貫穿的主體是如何思考設(shè)計(jì)開(kāi)發(fā)的方法,而具體的編程語(yǔ)言,只是提供一個(gè)具體場(chǎng)景方便介紹的媒介。入門(mén)入門(mén)容易理解而且讀起來(lái)幽默風(fēng)趣,對(duì)于編程初學(xué)者和語(yǔ)言新手而言是理想的書(shū)籍。 本文與大家分享一些Python編程語(yǔ)言的入門(mén)書(shū)籍,其中不乏經(jīng)典。我在這里分享的,大部分是這些書(shū)的英文版,如果有中文版的我也加上了。有關(guān)書(shū)籍的介紹,大部分截取自是官...

    desdik 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<