文章目录
  1. 1. try错误
  2. 2. 记录错误
  3. 3. 抛出错误
  4. 4. 断言
  5. 5. logging
  6. 6. pdb
  7. 7. pdb.set_trace()

try错误

1
2
3
4
5
6
7
8
try:
r = 10/0
print r
except ZeroDivisionError,e:
print 'except:',e
finally:
print 'finally'
print 'END'

在某段代码可能会出错时,就可以用try来运行这段代码,如果执行出错,则后续代码不会继续执行,而是直接跳转至错误处理代码,即except语句块,执行完except后,如果有finally语句块,则执行finally语句块,至此执行完毕
如果没有发生错误发生,可以在except语句块后面加一个else,如果没有错误发生时,会自动执行else语句

记录错误

Python内置的logging模块可以非常容易地记录错误信息:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#  err.py
import logging

def foo(s):
return 10 / int(s)

def bar(s):
return foo(s) * 2

def main():
try:
bar('0')
except StandardError,e:
logging.exception(e)

main()
print 'END'

同样是出错,但程序打印完错误后会继续执行,并正常退出

抛出错误

错误是class,捕获一个错误就是捕获到该class的一个实例,因此,错误不是凭空产生的,而是有意创建抛出的。Python内置函数会抛出很多类型的错误,可以使用raise语句抛出错误

1
2
3
4
5
6
7
8
9
#  err.py
class FooError(StandarError):
pass

def foo(s):
n = int(s)
if n == 0:
raise FooError('invalid value:%s' % s)
return 10/n

断言

1
2
3
4
5
6
7
8
#  err.py
def foo(s):
n = int(s)
assert n != 0,'n is zero!'
return 10 / n

def main():
foo('0')

assert的意思是,表达式n != 0应该是True,否则,后面的代码就会出错(AssertionError)
Python解释器可以用-0参数来关闭assert

logging

1
2
3
4
5
6
7
#  err.py
import logging

s = '0'
n = int(s)
logging.info('n = %d' % n)
print 10 / n

logging.info()可以输出一段文本,可以使用logging.basicConfig(level=logging.INFO)指定记录信息的级别,有debuginfowarningerror,当指定level=INFO时,其他级别都不起作用,其他同理。

pdb

调试器,可以让程序以单步方式运行,可以随时查看运行状态

1
2
3
4
#  err.py
s = '0'
n = int(s)
print 10 / n

然后启动
$ python -m pdb err.py
以参数-m pdb启动后,pdb定位到下一步要执行的代码-> s = '0'输入命令l查看运行代码
输入n可以单步指定代码
也可以输入p 变量名来查看变量
输入q结束调试,退出程序

pdb.set_trace()

只需要import pdb然后在可能出错的地方放一个pdb.set_trace()就可以设置一个断点

1
2
3
4
5
6
7
#  err.py
import pdb

s = '0'
n = int(s)
pdb.set_trace()
print 10 / n

运行代码,程序自动在pdb.set_trace()暂停并进入pdb调试环境,可以用c继续运行

文章目录
  1. 1. try错误
  2. 2. 记录错误
  3. 3. 抛出错误
  4. 4. 断言
  5. 5. logging
  6. 6. pdb
  7. 7. pdb.set_trace()