>>> def foo(s): ... n = int(s) ... print(n) ... return 10 / n ... >>> def main(): ... foo('0') ... >>> main() 0 Traceback (most recent call last): File "<stdin>", line 1, in <module> File "<stdin>", line 2, in main File "<stdin>", line 4, in foo ZeroDivisionError: division by zero
咱们能够在认为可能出错的地方打印变量,但这有很大的弊端,由于打印的代码没有实际功能,都是垃圾信息。并且print最后还得删除,因此第二种方法是用assert替代printpython
>>> def foo(s): ... n = int(s) ... assert n != 0,'n的值是0!' ... return 10 / n ... >>> def main(): ... foo('0') ... >>> main() Traceback (most recent call last): File "<stdin>", line 1, in <module> File "<stdin>", line 2, in main File "<stdin>", line 3, in foo AssertionError: n的值是0!
assert的意思,当后面的表达式为False时,就会抛出AssertionError,若是为True,什么都不作,直接到下一行。assert有一大特性:在启动python解释器的时候可使用-O参数来关闭assert(大写的o)函数
PS E:\Python3.6.3\workspace> python -O err_assert.py Traceback (most recent call last): File "err_assert.py", line 9, in <module> main() File "err_assert.py", line 7, in main foo('0') File "err_assert.py", line 4, in foo return 10 / n ZeroDivisionError: division by zer
import logging logging.basicConfig(level=logging.INFO) s = '0' n = int(s) logging.info('n=%d' % n) print(10/n) #执行结果 PS E:\Python3.6.3\workspace> python err_logginginfo.py INFO:root:n=0 Traceback (most recent call last): File "err_logginginfo.py", line 6, in <module> print(10/n) ZeroDivisionError: division by zero
使用logging不会抛出错误,直接输出到文件中。logging能够容许你指定记录信息的级别,级别由低到高分别是debug、info、warning、error、CRITICAL等级别,当定义高级别的时候,低级别的信息不会输出,这是把日志信息输出到控制台console,咱们还能够经过设置把日志输出到文件中post
可让程序以单步方式执行,方便咱们随时查看运行状态spa
新建程序err_pdb.pydebug
s = '0' n = int(s) print(10 / n)
而后以pdb模式启动调试
PS E:\Python3.6.3\workspace> python -m pdb err_pdb.py > e:\python3.6.3\workspace\err_pdb.py(1)<module>() -> s = '0' (Pdb) l 1 -> s = '0' 2 n = int(s) 3 print(10 / n) [EOF] (Pdb) n > e:\python3.6.3\workspace\err_pdb.py(2)<module>() -> n = int(s) (Pdb) p s '0' (Pdb) p n *** NameError: name 'n' is not defined (Pdb) n > e:\python3.6.3\workspace\err_pdb.py(3)<module>() -> print(10 / n) (Pdb) p n 0 (Pdb) p s '0' (Pdb) n ZeroDivisionError: division by zero > e:\python3.6.3\workspace\err_pdb.py(3)<module>() -> print(10 / n) (Pdb) n --Return-- > e:\python3.6.3\workspace\err_pdb.py(3)<module>()->None -> print(10 / n) (Pdb) n ZeroDivisionError: division by zero > <string>(1)<module>()->None (Pdb) n --Return-- > <string>(1)<module>()->None (Pdb) n Traceback (most recent call last): File "E:\Python3.6.3\lib\pdb.py", line 1667, in main pdb._runscript(mainpyfile) File "E:\Python3.6.3\lib\pdb.py", line 1548, in _runscript self.run(statement) File "E:\Python3.6.3\lib\bdb.py", line 431, in run exec(cmd, globals, locals) File "<string>", line 1, in <module> File "e:\python3.6.3\workspace\err_pdb.py", line 3, in <module> print(10 / n) ZeroDivisionError: division by zero Uncaught exception. Entering post mortem debugging Running 'cont' or 'step' will restart the program > e:\python3.6.3\workspace\err_pdb.py(3)<module>()->None -> print(10 / n) (Pdb) q Post mortem debugger finished. The err_pdb.py will be restarted > e:\python3.6.3\workspace\err_pdb.py(1)<module>() -> s = '0' (Pdb) n > e:\python3.6.3\workspace\err_pdb.py(2)<module>() -> n = int(s) (Pdb) q PS E:\Python3.6.3\workspace>
小写字母l,能够列出全部要执行的代码;
n 命令表示单步执行代码;
p 后面加上变量名,能够随时查看变量的值;
在pdb模式中,对于尚未单步执行到的代码,相关的变量的变动是无效的;
q 命令退出当前调试,进入从新从头开始调试,再次输入q,就会推出调试程序。
这种方式的调试,有一个弊端,就是只能一步一步的执行下去,若是程序有不少行,岂不是累死。
#err_pdb.py import pdb s = '0' n = int(s) pdb.set_trace() #程序运行到这里会自动中止,等待命令 print(10 / n)
咱们可使用l、c、n、p、q等命令来控制和查看程序rest
PS E:\Python3.6.3\workspace> python err_pdb.py > e:\python3.6.3\workspace\err_pdb.py(7)<module>() -> print(10 / n) (Pdb) p s '0' (Pdb) l 2 import pdb 3 4 s = '0' 5 n = int(s) 6 pdb.set_trace() #程序运行到这里会自动中止,等待命令 7 -> print(10 / n) [EOF] (Pdb) n ZeroDivisionError: division by zero > e:\python3.6.3\workspace\err_pdb.py(7)<module>() -> print(10 / n) (Pdb) c Traceback (most recent call last): File "err_pdb.py", line 7, in <module> print(10 / n) ZeroDivisionError: division by zero