V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
tetsuo
V2EX  ›  Python

python 错误处理的问题

  •  
  •   tetsuo · 2016-04-13 18:14:45 +08:00 · 3033 次点击
    这是一个创建于 3152 天前的主题,其中的信息可能已经有所发展或是发生改变。
    def foo(s):
    n = int(s)
    if n==0:
    raise ValueError('invalid value: %s' % s)
    return 10 / n

    def bar():
    try:
    foo('0')
    except ValueError as e:
    print('ValueError!')
    raise

    bar()

    最后一个 raise 有什么用?
    6 条回复    2016-04-14 14:36:50 +08:00
    oroge
        1
    oroge  
       2016-04-13 18:20:27 +08:00
    =====引用开始=====

    最后,我们来看另一种错误处理的方式:

    # err_reraise.py

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

    def bar():
    try:
    foo('0')
    except ValueError as e:
    print('ValueError!')
    raise

    bar()

    在 bar()函数中,我们明明已经捕获了错误,但是,打印一个 ValueError!后,又把错误通过 raise 语句抛出去了,这不有病么?

    其实这种错误处理方式不但没病,而且相当常见。捕获错误目的只是记录一下,便于后续追踪。但是,由于当前函数不知道应该怎么处理该错误,所以,最恰当的方式是继续往上抛,让顶层调用者去处理。

    =====引用完毕=====
    引用来源: http://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/00143191375461417a222c54b7e4d65b258f491c093a515000
    pimin
        2
    pimin  
       2016-04-13 21:41:29 +08:00 via Android
    我也是看廖的教程
    如果这里不继续抛出确实会有问题。
    至少是在调试的时候你可能很难定位到确切的错误地点。
    举个例子:
    try:
    ........with open('log.txt','r') as f:
    .............print(f.read())
    except:
    ....print('file error!')

    这样如果你文件编码有问题,打开文件是没有问题的
    错误会出现在 print 语句上。
    当然你可以写代码的时候多个 except 逐个去排查问题,但是我觉得没什么意义。
    syv2
        3
    syv2  
       2016-04-13 22:48:08 +08:00
    oroge 已经解释了原因了,我在补充一句,个人认为用「 raise error 」来显性地抛出异常,要比单独用「 raise 」在可读性上要好一些。
    xi2008wang
        4
    xi2008wang  
       2016-04-14 01:01:18 +08:00
    Python Cookbook
    14.10 重新抛出被捕获的异常
    通常是当你需要在捕获异常后执行某个操作(比如记录日志、清理等),
    但是之后想将异常传播下去
    kinghui
        5
    kinghui  
       2016-04-14 10:09:00 +08:00
    @syv2 两个代表不同的意思, raise error 是重新抛出该异常, raise 是传递该异常. Traceback 的表现会有不同, 单独使用 raise 能更精准的从 Traceback 中定位抛出异常的位置.
    syv2
        6
    syv2  
       2016-04-14 14:36:50 +08:00 via iPhone
    @kinghui 你说的对。可能和我的应用需求有关,我一般不用来跟踪异常,而是把异常当作返回,在 except 里对异常做一次封装,由整个系统最外部的异常 handle 作统一处理。如果是调试阶段,确实直接 raise 更容易跟踪问题。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2695 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 02:07 · PVG 10:07 · LAX 18:07 · JFK 21:07
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.