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:捕獲指定的錯誤類型并賦值給變量e。except可以有多個
??? 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,因為UnicodeError是ValueError的子類,如果有,也被第一個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章错误处理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Markdown批量发布到Github
- 下一篇: websocket python爬虫_p