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

歡迎訪問 生活随笔!

生活随笔

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

python

【廖雪峰Python学习笔记】错误、调试、测试

發布時間:2023/11/27 python 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【廖雪峰Python学习笔记】错误、调试、测试 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

    • 錯誤處理
    • 調試
    • 單元測試unitcase
    • 文檔測試

錯誤類型

  1. 程序編寫問題bug – 字符類型錯誤等
  2. 用戶輸入錯誤 – 輸入不符合規定的字符串
  3. 異常,程序運行時無法預測 – 磁盤滿了,無法寫

錯誤處理

錯誤處理機制:try…except…finally…

  1. try運行可能會出錯的代碼,若出錯則后續代碼不再運行
  2. try中存在錯誤代碼時,執行except語句塊拋出異常
  3. finally可有可無,不論是否異常,最后都會執行
  4. 所有錯誤類型均繼承自BaseException
  5. 不同except可以對不同錯誤類型進行處理
  6. except可以捕獲自身及子類的錯誤
  7. except可以跨越多層調用
try:print('try...')test_int = 10 / int('a')				# 除法運算錯誤print('result = ', test_int)			# 由于上一行代碼錯誤,try的后續代碼不再運行
except ZeroDivisionError as e:		print('except: ', e)
except ValueError as e:print('ValueError:', e)
elseprint('no error was found!')
finally:print('finally...')
print('END')

調用棧:出錯時,須分析錯誤的調用棧信息,以定位錯誤的位置

Traceback (most recent call last):…………

logging模塊可以記錄錯誤信息,且程序可繼續執行

import logging
def foo(s):return 10 / int(s)
def bar(s):return foo(s) * 2
def main():try:bar('0')except Exception as e:logging.exception(e)
main()

輸出結果:

ERROR:root:division by zero
Traceback (most recent call last):File "/Pratice/DEMO.py", line 8, in mainbar('0')File "/Pratice/DEMO.py", line 5, in barreturn foo(s) * 2File "/Pratice/DEMO.py", line 3, in fooreturn 10 / int(s)
ZeroDivisionError: division by zero

raise拋出一個錯誤的實例

def foo(s):n = int(s)if n==0:raise ValueError('invalid value: %s' % s)return 10 / ndef bar():try:foo('0')except ValueError as e:print('ValueError!')raisebar()

輸出結果:

Traceback (most recent call last):
ValueError!File "/Pratice/DEMO1.py", line 14, in <module>bar()File "/Pratice/DEMO1.py", line 9, in barfoo('0')File "/Pratice/DEMO1.py", line 4, in fooraise ValueError('invalid value: %s' % s)
ValueError: invalid value: 0

調試

使用print()調試,簡單粗暴,但是調試過后需要刪除調試代碼

  1. assert()斷言
def foo(s):n = int(s)assert n != 0, 'n is zero'	# 若‘n != 0’不成立,則拋出AssertionErrorreturn 10/sdef main():foo('0')
main()
	輸出結果:
Traceback (most recent call last):File "/Pratice/DEMO2.py", line 8, in <module>main()File "/Pratice/DEMO2.py", line 7, in mainfoo('0')File "/Pratice/DEMO2.py", line 3, in fooassert n != 0, 'n is zero'
AssertionError: n is zero

tips:python -O DEMO2.py 可以將DEMO2.py中的assert當成pass來看
2. logging()記錄
輸出文件而不是拋出錯誤
可指定記錄信息的級別
通過簡單配置,一條語句可同時輸出到不同地方

import logging
# 指定記錄信息的級別 debug->info->warning->error
logging.basicConfig(level=logging.INFO)	s = '0'
n = int(s)
logging.info('n = %d' % n)
print(10 / n)

輸出結果:

INFO:root:n = 0
Traceback (most recent call last):File "/Pratice/DEMO3.py", line 7, in <module>print(10 / n)
ZeroDivisionError: division by zero
  1. pdb調試器
    讓程序以單步方式運行,隨時查看運行狀態
?  python -m pdb DEMO.py	# 使用調試器查看單步運行狀態
> /Users/amey/growingio/Pratice/DEMO.py(1)<module>()
-> import logging
(Pdb) l								# l查看代碼1  -> import logging2     logging.basicConfig(level=logging.INFO)3     4     s = '0'5     n = int(s)6     logging.info('n = %d' % n)7     print(10 / n)
[EOF]
(Pdb) n								# n -> 單步執行代碼
> /Users/amey/growingio/Pratice/DEMO.py(2)<module>()
-> logging.basicConfig(level=logging.INFO)
(Pdb) n								# n -> 單步執行代碼
> /Users/amey/growingio/Pratice/DEMO.py(4)<module>()
-> s = '0'
(Pdb) p s							# p 變量名 -> 查看變量
> '0'
(Pdb) q								# q -> 結束調試

單元測試unitcase

  1. setUp()tearDown()方法,在調用一個測試方法前后分別執行
    [eg:連接關閉數據庫]
  2. 使用python -m unittest test可以批量運行多個單元測試

編寫一個學生成績單元測試

import unittestclass Student(object):def __init__(self, name ,score):self.name = nameself.score = scoredef get_grade(self):if(self.score > 100 or self.score < 0 or type(self.score) != int):raise ValueErrorelif(self.score < 60):return 'C'elif(self.score < 80):return 'B'else:return 'A'class TestStudent(unittest.TestCase):def test_80_to_100(self):s1 = Student('Amey', 100)s2 = Student('Jimmy', 80)self.assertEqual(s1.get_grade(),'A')self.assertEqual(s2.get_grade(),'A')def test_60_to_800(self):s1 = Student('Bart', 79)s2 = Student('Cindy', 60)self.assertEqual(s1.get_grade(),'B')self.assertEqual(s2.get_grade(),'B')def test_0_to_60(self):s1 = Student('Dan', 59)s2 = Student('Lisa', 0)self.assertEqual(s1.get_grade(),'C')self.assertEqual(s2.get_grade(),'C')def test_invaild(self):s1 = Student('Jan', 101)s2 = Student('King', -1)with self.assertRaises(ValueError):s1.get_grade()with self.assertRaises(ValueError):s2.get_grade()if __name__ == '__main__':unittest.main()

測試結果:

? python -m unittest DEMO4   
....
----------------------------------------------------------------------
Ran 4 tests in 0.000sOK

文檔測試

doctest模塊:可提取注視中的代碼并執行測試

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
def fact(n):'''計算 1*2*3*...*n>>> fact(1)1>>> fact(-1)Traceback (most recent call last):File "/Pratice/demo.py", line 13, in <module>print(fact(-1))File "/Pratice/demo.py", line 7, in factraise ValueErrorValueError>>> fact(10)3628800'''if(n < 1):raise ValueErrorif(n == 1):return 1return n * fact(n-1)if __name__ == '__main__':import doctestdoctest.testmod()

總結

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

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

歡迎分享!

轉載請說明來源于"生活随笔",并保留原作者的名字。

本文地址:【廖雪峰Python学习笔记】错误、调试、测试