异常与调试

通过try...except...finally处理异常。

try:
    print 'try...'
    r = 10 / 0
    print 'result:', r
except ValueError, e:
    print 'ValueError:', e
except ZeroDivisionError, e:
    print 'except:', e
finally:
    print 'finally...'
print 'END'

调用
try...
except: integer division or modulo by zero
finally...
END

调用堆栈

出现异常返回时,会打印调用堆栈

# err.py:
def foo(s):
    return 10 / int(s)

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

def main():
    bar('0')

main()

执行结果:
$ python err.py
Traceback (most recent call last):
  File "err.py", line 11, in <module>
    main()
  File "err.py", line 9, in main
    bar('0')
  File "err.py", line 6, in bar
    return foo(s) * 2
  File "err.py", line 3, in foo
    return 10 / int(s)
ZeroDivisionError: integer division or modulo by zero

记录错误

# 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'

抛出异常

# err.py
class FooError(StandardError):
    pass

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

raise语句如果不带参数,就会把当前错误原样抛出

# err.py
def foo(s):
    n = int(s)
    return 10 / n

def bar(s):
    try:
        return foo(s) * 2
    except StandardError, e:
        print 'Error!'
        raise

def main():
    bar('0')

main()

调试

  • print打印
  • 断言 断言失败,assert语句本身就会抛出AssertionError:
# err.py
def foo(s):
    n = int(s)
    assert n != 0, 'n is zero!'
    return 10 / n

def main():
    foo('0')

启动Python解释器时可以用-O参数来关闭assert

  • logging 打印日志
  • 启动Python的调试器pdb,让程序以单步方式运行

python -m pdb err.py
pdb.set_trace() 设置断点
pycharm IDE也可以设置断点执行

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 高级语言通常都内置了一套try...except...finally...的错误处理机制,Python也不例外。 ...
    时间之友阅读 808评论 0 1
  • 引言 在程序运行过程中(注意是运行阶段,程序可以通过编译),如果JVM检测出一个不可能执行的操作,就会出现运行时错...
    Steven1997阅读 2,518评论 1 6
  • http://www.liaoxuefeng.com/wiki/0014316089557264a6b348958...
    喵在野阅读 322评论 0 1
  • 昨天班级群里又下通知,明天是学校家长开放日,以前是很想去的。可是这上周刚请了假,这周再请不大合适。主要岗位特...
    star卫星阅读 146评论 0 0
  • 作家曾焱冰有一句话:我们需要不断庆贺眼前的美好,方得以无畏前行。爱和美,是我们能对庸常生活所做的最大的改变和不妥协...
    行一馆阅读 292评论 0 0