如何正确忽略异常

2024-04-23 11:49:40 发布

您现在位置:Python中文网/ 问答频道 /正文

当您只想尝试而不处理异常时,如何在Python中进行?

以下是正确的方法吗?

try:
    shutil.rmtree(path)
except:
    pass

Tags: path方法passtryrmtreeshutilexcept
3条回答

通常认为最好的做法是只抓住你感兴趣的错误。在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:need string或buffer,int found”-您可能不想忽略这一点,这可能很难调试。

如果您确实想忽略所有错误,请捕获Exception,而不是一个简单的except:语句。再说一遍,为什么?

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

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

将其与正确退出的以下各项进行比较:

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

如果您想编写性能更好的代码,^{}异常可以表示各种错误,但在上面的示例中,我们只想忽略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

您还可以^{}并将if更改为if e.errno == errno.ENOENT:

When you just want to do a try catch without handling the exception, how do you do it in Python?

这取决于你所说的“处理”是什么意思

如果你想在不采取任何行动的情况下抓到它,你发布的代码将起作用。

如果您的意思是希望对异常执行操作,而不阻止异常向上堆栈,则需要如下所示:

try:
    do_something()
except:
    handle_exception()
    raise  #re-raise the exact same exception that was thrown
try:
    doSomething()
except: 
    pass

或者

try:
    doSomething()
except Exception: 
    pass

区别在于,第一个还将捕获KeyboardInterruptSystemExit和类似的内容,它们直接来自exceptions.BaseException,而不是exceptions.Exception
有关详细信息,请参阅文档:

相关问题 更多 >