每個程式能一次寫完並正常執行的概率基本不超過1%,因為總會有各種各樣的bug需要修正。有的bug很簡單,看看錯誤資訊就知道,有的bug很複雜,我們需要知道出錯時,哪些變數的值是正確的,哪些變數的值是錯誤的,因此,需要一整套除錯程式的手段來修復bug。
第一種方法簡單直接粗暴有效,就是用print()把可能有問題的變數列印出來看看:
def
foo(s)
: n =
int(s)
print
('>>> n = %d'
% n)
return
10/ n
defmain()
: foo(
'0')
main(
)
輸出結果:
>>
> n =
0traceback (most recent call last)
: file "f:/python檔案/tiaoshi/__init__.py"
, line 9,in
main(
) file "f:/python檔案/tiaoshi/__init__.py"
, line 7
,in main
foo(
'0')
file "f:/python檔案/tiaoshi/__init__.py"
, line 4
,in foo
return
10/ n
zerodivisionerror: division by zero
當然這種方法存在著弊端,執行結果中包含很多沒有意義的資訊,所以,出現了第二種方法:
凡是用print()來輔助檢視的地方,都可以用斷言(assert)來替代:
def
foo(s)
: n =
int(s)
assert n !=0,
'n is zero!'
return
10/ n
defmain()
: foo(
'0')
main(
)
assert的意思是,表示式n != 0應該是true,否則,根據程式執行的邏輯,後面的**肯定會出錯。
如果斷言失敗,assert語句本身就會丟擲assertionerror:
assert n !=0,
'n is zero!'
assertionerror: n is zero!
把print()替換為logging是第3種方式,和assert比,logging不會丟擲錯誤,而且可以輸出到檔案:
>>
>
import logging
>>
> s =
'0'>>
> n =
int(s)
>>
> logging.info(
"n=%d"
%n)>>
>
print(10
/n)
但我們發現輸出結果卻很簡單草率:
traceback (most recent call last)
: file ""
, line 1,in
print(10
/n)zerodivisionerror: division by zero
然後我們加一句配置再次嘗試:
logging.basicconfig(level=logging.info)
info:root:n =
0traceback (most recent call last)
: file "err.py"
, line 8,in
print(10
/ n)
zerodivisionerror: division by zero
這就是logging的好處,它允許你指定記錄資訊的級別,有debug,info,warning,error等幾個級別,當我們指定level=info時,logging.debug就不起作用了。同理,指定level=warning後,debug和info就不起作用了。這樣一來,你可以放心地輸出不同級別的資訊,也不用刪除,最後統一控制輸出哪個級別的資訊。
logging的另乙個好處是通過簡單的配置,一條語句可以同時輸出到不同的地方,比如console和檔案。
SQL隨手筆記(2)
1.區域性變數 使用者自定義變數,變數前應加 使用範圍是定義區域性變數的批 儲存過程 觸發器。定義 declare 變數名 資料型別 資料型別可以是sql支援的資料型別 eg declare name varchar 64 使用set給區域性變數賦值 使用print輸出區域性變數的值 eg set ...
Python隨手筆記 二)
本文目錄 2.1 布林值 2.2 比較操作符 2.3 布林操作符 2.4 控制流的元素 2.5 控制流語句雖然整型 浮點型和字串資料型別有無數種可能的值,但 布林 資料型別 只有兩種值 true 和 false。在作為 python 輸入時,布林值 true 和 false 不像字串,兩邊沒有引號,...
oracle隨手筆記
1.儲存過程中is和as沒區別檢視 用is 游標 用as 不能反過來,其他情況沒區別 2.trim是用來去除字串開頭和結尾的函式 用法 select trim leading trailing both 你要刪的東西 from 被刪的字串 test trim from dual both後面沒有引數...