如何正确地忽略异常?

当你只是想做一个尝试 - 除了没有处理异常,除了Python,你怎么做?

以下是正确的做法吗?

try:
    shutil.rmtree(path)
except:
    pass

try:
  doSomething()
except: 
  pass

要么

try:
  doSomething()
except Exception: 
  pass

不同之处在于,第一个也会捕获KeyboardInterruptSystemExit等类似的东西,它们直接来自exceptions.BaseException ,而不是exceptions.Exception
详情请参阅文档:

  • 尝试声明 - http://docs.python.org/reference/compound_stmts.html#try
  • 例外 - http://docs.python.org/library/exceptions

  • 通常认为最好的做法是只捕获你感兴趣的错误。对于shutil.rmtree ,可能是OSError

    >>> shutil.rmtree("/fake/dir")
    Traceback (most recent call last):
        [...]
    OSError: [Errno 2] No such file or directory: '/fake/dir'
    

    如果你想默默地忽略那个错误,你会这样做:

    try:
        shutil.rmtree(path)
    except OSError:
        pass
    

    为什么? 说你(不知何故)意外地传递一个整数而不是一个字符串,如:

    shutil.rmtree(2)
    

    它会给出错误“TypeError:强制为Unicode:需要字符串或缓冲区,找到int” - 您可能不想忽略该错误,这可能很难调试。

    如果您肯定要忽略所有错误,请捕获Exception而不是纯粹的except:语句。 同样,为什么?

    不指定异常会捕获每个异常,包括例如sys.exit()使用的SystemExit异常:

    >>> try:
    ...     sys.exit(1)
    ... except:
    ...     pass
    ... 
    >>>
    

    将此与以下正确的退出相比较:

    >>> try:
    ...     sys.exit(1)
    ... except Exception:
    ...     pass
    ... 
    shell:~$ 
    

    如果你想写更好的行为代码, OSError异常可以代表各种错误,但在上面的例子中,我们只想忽略Errno 2 ,所以我们可以更具体:

    try:
        shutil.rmtree(path)
    except OSError, e:
        if e.errno == 2:
            # suppress "No such file or directory" error
            pass
        else:
            # reraise the exception, as it's an unexpected error
            raise
    

    您也可以import errno并将if更改为if e.errno == errno.ENOENT:


    当你只想做一个try catch而不处理异常时,你如何在Python中做到这一点?

    这取决于你的意思是“处理”。

    如果你的意思是在没有采取任何行动的情况下抓住它,你发布的代码将会起作用。

    如果你的意思是你想对异常采取行动而没有​​停止堆栈上的异常,那么你需要这样的东西:

    try:
        do_something()
    except:
        handle_exception()
        raise  #re-raise the exact same exception that was thrown
    
    链接地址: http://www.djcxy.com/p/4391.html

    上一篇: How to properly ignore Exceptions?

    下一篇: Catch multiple exceptions at once?