<button id="2ddn7"><acronym id="2ddn7"></acronym></button>

<button id="2ddn7"><acronym id="2ddn7"></acronym></button>

  • <button id="2ddn7"><object id="2ddn7"></object></button>
      1. <s id="2ddn7"></s>
        更多課程 選擇中心


        Python培訓

        400-111-8989

        Python錯誤、調試和測試

        • 發布:Python培訓
        • 來源:Python教程知識
        • 時間:2018-03-26 13:55

        1.錯誤處理

        Python內置了 try...except...finally...的錯誤處理機制。

        如果認為代碼可能出錯,用try運行代碼;如果代碼執行出錯,直接跳轉到except語句,except語句可以有多個;如果沒有錯誤,會執行else語句;如果有finally,則最后執行finally語句。如:

        	
        	
        	
        	
        	
        	
        1. try:

        2.    print('try...')

        3.    r = 10 / 0

        4.    print('result:', r)

        5. except ValueError as e:

        6.    print('ValueError:', e)

        7. except ZeroDivisionError as e:

        8.    print('except:', e)

        9. else:

        10.    print('no error!')

        11. finally:

        12.    print('finally...')

        13. print('END')

        錯誤信息是一個調用棧,可以跟蹤錯誤信息。

        2.logging打印

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

        	
        	
        	
        	
        	
        	
        1. import logging

        2. def main():

        3.    try:

        4.        bar('0')

        5.    except Exception as e:

        6.        logging.exception(e)

        3.raise拋出錯誤

        可以自己定義錯誤類型,然后通過 raise語句拋出錯誤的實例。

        	
        	
        	
        	
        	
        	
        1. class FooError(ValueError):

        2.    pass

        3. def foo(s):

        4.    n = int(s)

        5.    if n==0:

        6.        raise FooError('invalid value: %s' % s)

        7.    return 10 / n

        8. foo('0')

        4.調試

        簡單的辦法是通過print()打印錯誤信息,還有一種是使用斷言(assert)。凡是可以用print的地方都可以都可以使用斷言。

        	
        	
        	
        	
        	
        	
        1. def foo(s):

        2.    n = int(s)

        3.    assert n != 0, 'n is zero!'

        4.    return 10 / n

        5. def main():

        6.    foo('0')

        啟動Python解釋器時可以用-O(字母O)參數來關閉assert:

        	
        	
        	
        	
        	
        	
        1. $ python -O err.py

        前面說的logging其實可以更加強力,它允許指定記錄信息的級別。信息有debug,info,warning,error等幾個級別。比如:

        	
        	
        	
        	
        	
        	
        1. import logging

        2. logging.basicConfig(level=logging.INFO)

        當指定level為info時,debug就不起作用了;指定為warning時,debug和info就不起作用了。

        pdb是另一種調試方法,它是Python的調試器,讓程序以單步的方式運行。當然通過IDE進行單步調試是最好的。

        5.單元測試

        通過使用Python自帶的unittest模塊,可以進行單元測試。編寫一個類繼承unittest.TestCase。

        	
        	
        	
        	
        	
        	
        1. class Dict(dict):

        2.    def __init__(self, **kw):

        3.        super().__init__(**kw)

        4.    def __getattr__(self, key):

        5.        try:

        6.            return self[key]

        7.        except KeyError:

        8.            raise AttributeError(r"'Dict' object has no attribute '%s'" % key)

        9.    def __setattr__(self, key, value):

        10.        self[key] = value

        上面的Dict類的單元測試可以寫為:

        	
        	
        	
        	
        	
        	
        1. import unittest

        2. from mydict import Dict

        3. class TestDict(unittest.TestCase):

        4.    def test_init(self):

        5.        d = Dict(a=1, b='test')

        6.        self.assertEqual(d.a, 1)

        7.        self.assertEqual(d.b, 'test')

        8.        self.assertTrue(isinstance(d, dict))

        9.    def test_key(self):

        10.        d = Dict()

        11.        d['key'] = 'value'

        12.        self.assertEqual(d.key, 'value')

        13.    def test_attr(self):

        14.        d = Dict()

        15.        d.key = 'value'

        16.        self.assertTrue('key' in d)

        17.        self.assertEqual(d['key'], 'value')

        18.    def test_keyerror(self):

        19.        d = Dict()

        20.        with self.assertRaises(KeyError):

        21.            value = d['empty']

        22.    def test_attrerror(self):

        23.        d = Dict()

        24.        with self.assertRaises(AttributeError):

        25.            value = d.empty

        以test開頭的方法就是測試方法,不以test開頭的方法不被認為是測試方法,測試的時候不會被執行。對每一類測試都需要編寫一個test_xxx()方法。

        單元測試中提供了很多內置的條件判斷。通過調用這些方法就可以斷言輸出是否是期望的。

        單元測試的運行可以在后面加上:

        	
        	
        	
        	
        	
        	
        1. if __name__ == '__main__':

        2.    unittest.main()

        將Python作為一個正常的腳本運行。或者通過命令行參數運行。

        	
        	
        	
        	
        	
        	
        1. $ python -m unittest mydict_test

        當然用直接用IDE也是可以的。

        單元測試有兩個特殊的方法, setUp()tearDown()方法,這兩個方法會分別在每調用一個測試方法的前后分別被執行。

        setUp()和tearDown()方法有什么用呢?設想你的測試需要啟動一個數據庫,這時,就可以在setUp()方法中連接數據庫,在tearDown()方法中關閉數據庫,這樣,不必在每個測試方法中重復相同的代碼。

        6.文檔測試

        Python內置的“文檔測試”(doctest)模塊可以直接提取注釋中的代碼并執行測試。

        doctest嚴格按照Python交互式命令行的輸入和輸出來判斷測試結果是否正確。只有測試異常的時候,可以用...表示中間一大段的輸出。

        	
        	
        	
        	
        	
        	
        1. class Dict(dict):

        2.    '''

        3.    Simple dict but also support access as x.y style.

        4.    >>> d1 = Dict()

        5.    >>> d1['x'] = 100

        6.    >>> d1.x

        7.    100

        8.    >>> d1.y = 200

        9.    >>> d1['y']

        10.    200

        11.    >>> d2 = Dict(a=1, b=2, c='3')

        12.    >>> d2.c

        13.    '3'

        14.    >>> d2['empty']

        15.    Traceback (most recent call last):

        16.        ...

        17.    KeyError: 'empty'

        18.    >>> d2.empty

        19.    Traceback (most recent call last):

        20.        ...

        21.    AttributeError: 'Dict' object has no attribute 'empty'

        22.    '''

        23.    def __init__(self, **kw):

        24.        super(Dict, self).__init__(**kw)

        25.    def __getattr__(self, key):

        26.        try:

        27.            return self[key]

        28.        except KeyError:

        29.            raise AttributeError(r"'Dict' object has no attribute '%s'" % key)

        30.    def __setattr__(self, key, value):

        31.        self[key] = value

        32. if __name__=='__main__':

        33.    import doctest

        34.    doctest.testmod()

        運行時什么輸出都沒有,這時正常的。但是如果代碼有錯誤,比如沒有getattr方法,文檔測試就會出錯。

        看最后兩行代碼,當模塊正常導入時,doctest不會被執行。只有在命令行直接運行時,才執行doctest。

        預約申請免費試聽課

        填寫下面表單即可預約申請免費試聽!怕錢不夠?可就業掙錢后再付學費! 怕學不會?助教全程陪讀,隨時解惑!擔心就業?一地學習,可全國推薦就業!

        上一篇:Python數據科學學習書籍書單推薦
        下一篇:Python爬蟲:該如何學習數據爬蟲

        Python中類的屬性有哪幾種

        Python語法你知道多少

        Python 中常見的配置文件寫法

        Python爬蟲可以做什么

        • 掃碼領取資料

          回復關鍵字:視頻資料

          免費領取 達內課程視頻學習資料

        • 視頻學習QQ群

          添加QQ群:1143617948

          免費領取達內課程視頻學習資料

        Copyright ? 2021 Tedu.cn All Rights Reserved 京ICP備08000853號-56 京公網安備 11010802029508號 達內時代科技集團有限公司 版權所有

        選擇城市和中心
        黑龍江省

        吉林省

        河北省

        湖南省

        貴州省

        云南省

        廣西省

        海南省

        青青青草网站免费观看|青青青视频在线观看 超真实强奷视频在线看 百度 好搜 搜狗
        <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <文本链> <文本链> <文本链> <文本链> <文本链> <文本链>