成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

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

techstay / 2148人閱讀

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

1. 語法錯誤
Python 的語法錯誤被稱為解析錯,語法分析器會指出出錯的代碼行,并且在最先找到的錯誤的位置標(biāo)記一個小小的箭頭。
>>> while True 
  File "", line 1
    while True 
              ^
SyntaxError: invalid syntax
2. 異常
即使 Python 程序的語法是正確的,但是在運行的時候,也有可能發(fā)生錯誤,運行期監(jiān)測到的錯誤稱為異常。
>>> 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 語句按照以下方式工作:

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

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

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

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

若異常沒有與任何的 except 匹配,那么這個異常將會傳遞到上層的 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

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

一個 except 子句可以同時處理多個異常,這些異常被放在一個括號里成為一個元組。

except (RuntimeError, TypeError, NameError):
    pass

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

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

# 沒有相應(yīng)文件時報錯
OS error: [Errno 2] No such file or directory: "test.txt"

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

try except 語句還有一個可選的 else 子句,如果使用這個子句,那么必須放在所有的 except 子句之后。這個子句將在try子句沒有發(fā)生任何異常的時候執(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 子句比把所有語句都放在 try 子句里面要好,這樣可以避免一些意想不到的而 except 又沒有捕獲到的異常

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

3. 用戶自定義異常

我們可以通過創(chuàng)建一個新的異常類來擁有自己的異常。異常類繼承自 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 語句還有另外一個可選的子句 finally,它定義了無論任何情況下都會執(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"

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

參考資料 菜鳥教程

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

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

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/44878.html

相關(guān)文章

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

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

    xiguadada 評論0 收藏0
  • 從JavaScript到Python異常

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

    xcold 評論0 收藏0
  • 編程書單:十本Python編程語言的入門書籍

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

    desdik 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<