日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

Python学习笔记__8章错误、调试和测试__8.1章错误处理

發布時間:2025/3/18 python 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python学习笔记__8章错误、调试和测试__8.1章错误处理 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

# 這是學習廖雪峰老師python教程的學習筆記

1、概覽

我們在運行程序或編寫函數時,發生錯誤后,系統都會返回錯誤信息。我們可以通過某些機制,讓錯誤信息更加明了

1.1、try

try機制的格式就是 try…except…finally。

try:? ?# try: 運行這段代碼,若代碼有誤,就執行except

??? print('try...')

??? r = 10 / 0

??? print('result:', r)

except ZeroDivisionError as e: ?# except:捕獲指定的錯誤類型并賦值給變量eexcept可以有多個

??? print('except:', e)

finally:? # try except 執行完后,執行finally

??? print('finally...')

注意:

Python的錯誤其實也是class,所有的錯誤類型都繼承自BaseException,所以在使用except時需要注意的是,它不但捕獲該類型的錯誤,還把其子類也“一網打盡”。比如:

try:
??? foo()
except ValueError as e:
??? print(
'ValueError')
except UnicodeError as e:
??? print(
'UnicodeError')

第二個except永遠也捕獲不到UnicodeError,因為UnicodeErrorValueError的子類,如果有,也被第一個except給捕獲了。

?

1.2、調用棧

$ python3 err.py

Traceback (most recent call last):

? File "err.py", line 11, in <module>

??? main()

? File "err.py", line 9, in main

??? bar('0')

? File "err.py", line 6, in bar

??? return foo(s) * 2

? File "err.py", line 3, in foo

??? return 10 / int(s)

ZeroDivisionError: division by zero

調用棧就是系統自己返回的錯誤信息。看調用棧,從上往下看。最后三行指明了錯誤的根源

1.3、記錄錯誤

如果不捕獲錯誤,可以讓Python解釋器來打印出錯誤堆棧,但程序也被結束了。

我們也可以捕獲錯誤,把錯誤堆棧打印出來,然后分析錯誤原因,同時,讓程序繼續執行下去。

Python內置的logging模塊可以非常容易地記錄錯誤信息。

import logging

def foo(s):

??? return 10 / int(s)? # 錯誤根源

def bar(s):

??? return foo(s) * 2

def main():

??? try:

??????? bar('0')? # main()調用bar()bar()調用foo()

??? except Exception as e:

??????? logging.exception(e)

?

main()

print('END')

?

因為有 logging.exception(e)。執行 .py文件后。會繼續執行,打印出“END”

1.4、拋出錯誤

錯誤是class,捕獲一個錯誤就是捕獲到該class的一個實例。所以,錯誤并不是憑空產生的,而是有意創建并拋出的。拋出的錯誤既可以是Python的內置函數定義的,也可以是我們自己定義的

1、第一種拋出:

# err_raise.py

class FooError(ValueError):? # 定義了一個錯誤類

??? pass

?

def foo(s):

??? n = int(s)

??? if n==0:

??????? raise FooError('invalid value: %s' % s)? # 拋出自己定義的錯誤類

??? return 10 / n

?

foo('0') # 調用函數

2、第二種拋出:

# err_reraise.py

def foo(s):

??? n = int(s)

??? if n==0:

??????? raise ValueError('invalid value: %s' % s)? # 拋出ValueError錯誤

??? return 10 / n

?

def bar():

??? try:

??????? foo('0')

??? except ValueError as e: ?# 捕捉錯誤

??????? print('ValueError!')

??????? raise # raise不帶參數,把當前錯誤原樣拋出。因為調用了foo(),所以拋給foo()

?

bar() # 調用函數

ValueError!? # except捕獲錯誤后的print

Traceback (most recent call last): ??#原樣拋出錯誤,表現形式為協議棧

? File "<stdin>", line 1, in <module>

? File "<stdin>", line 3, in bar

? File "<stdin>", line 4, in foo

ValueError: invalid value: 0? ?# foo()拋出捕獲的錯誤

?

1.5、錯誤的轉換

在except中raise一個Error,可以把一種類型的錯誤轉化成另一種類型

try:

??? 10 / 0

except ZeroDivisionError:

??? raise ValueError('input error!')


轉載于:https://blog.51cto.com/12758568/2116869

總結

以上是生活随笔為你收集整理的Python学习笔记__8章错误、调试和测试__8.1章错误处理的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。