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
此外,若是沒有錯誤發生,能夠在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。