python學習——基礎(八)

python 內置了一套try...except...finally...的錯誤處理機制; html

try:
    print 'try'
    r = 10 / 0
    print 'result:', r

except ZeroDivisionError, e:
    print 'except:', e

finally:
    print 'finally'

結果:
try
except: integer division or modulo by zero
finally


finally語句塊是必定會執行的;

此外,若是沒有錯誤發生,能夠在except語句塊後面加一個else,當沒有錯誤發生時,會自動執行else語句: java

try:
    print 'try'
    r = 10 / 1
    print 'result:', r

except ZeroDivisionError, e:
    print 'except:', e

else:
    print 'no error'
finally:
    print 'finally'


結果:
try
result: 10
no error
finally


Python全部的錯誤都是從BaseException類派生的,常見的錯誤類型和繼承關係看這裏: python

https://docs.python.org/2/library/exceptions.html#exception-hierarchy django

能夠導入logging模塊記錄異常到日誌文件中;

import logging

logging能夠指定信息的級別:debug,info,warning,error這幾個級別,你能夠指定該文件的日誌級別 app

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


logging的另外一個好處是經過簡單的配置,一條語句能夠同時輸出到不一樣的地方,好比console和文件 單元測試


rasie將錯誤進行拋出,這種辦法不只能夠解決了不知道如何處理的狀況;同時能夠改變拋出錯誤的類型;
測試

try:
    print 'try'
    r = 10 / 0
    print 'result:', r

except ZeroDivisionError, e:
    print 'except:', e
    raise ValueError(e)

finally:
    print 'finally'

結果:
try
except: integer division or modulo by zero
finally
Traceback (most recent call last):
  File "F:/hz_viking/PycharmProjects/django_demo/WebBase/apps/cm/syc/varibleScope.py", line 353, in <module>
    raise ValueError(e)
ValueError: integer division or modulo by zero


斷言:

用assert(斷言)去替代print; spa

def test(i):

    try:
        print 'try'
        assert i != 0,  'i is zero' # 斷言i是否爲0,若是爲False,就會打印後面的說明

    except ZeroDivisionError, e:
        print 'except:', e
        raise ValueError(e)

    finally:
        print 'finally'

test(0)

結果:
Traceback (most recent call last):
  File "F:/hz_viking/PycharmProjects/django_demo/WebBase/apps/cm/syc/varibleScope.py", line 358, in <module>
    test(0)
  File "F:/hz_viking/PycharmProjects/django_demo/WebBase/apps/cm/syc/varibleScope.py", line 349, in test
    assert i != 0,  'i is zero'
AssertionError: i is zero


程序中若是處處充斥着assert,和print相比也好不到哪去。不過,啓動Python解釋器時能夠用-O參數來關閉assert debug

python -O err.py


單元測試:

爲了編寫單元測試,咱們須要引入Python自帶的unittest模塊:
日誌

import unittest
class TestDict(unittest.TestCase):

    def test_init(self):
        d = {'java':'diffcult', 'python':'midle'}
        self.assertEqual(d.get('java'), 'diffcult')


編寫單元測試時,咱們須要編寫一個測試類,從unittest.TestCase繼承。

以test開頭的方法就是測試方法,不以test開頭的方法不被認爲是測試方法,測試的時候不會被執行。

單元測試能夠有效地測試某個程序模塊的行爲,是將來重構代碼的信心保證。

單元測試的測試用例要覆蓋經常使用的輸入組合、邊界條件和異常。

單元測試代碼要很是簡單,若是測試代碼太複雜,那麼測試代碼自己就可能有bug。

單元測試經過了並不意味着程序就沒有bug了,可是不經過程序確定有bug。

相關文章
相關標籤/搜索