2024-04-23 11:49:40 发布
网友
当您只想尝试而不处理异常时,如何在Python中进行?
以下是正确的方法吗?
try: shutil.rmtree(path) except: pass
通常认为最好的做法是只抓住你感兴趣的错误。在shutil.rmtree的情况下,可能是OSError:
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:语句。再说一遍,为什么?
Exception
except:
不指定异常捕获每个异常,包括SystemExit异常,例如sys.exit()使用:
SystemExit
sys.exit()
>>> try: ... sys.exit(1) ... except: ... pass ... >>>
将其与正确退出的以下各项进行比较:
>>> try: ... sys.exit(1) ... except Exception: ... pass ... shell:~$
如果您想编写性能更好的代码,^{}异常可以表示各种错误,但在上面的示例中,我们只想忽略Errno 2,因此我们可以更加具体:
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:
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
区别在于,第一个还将捕获KeyboardInterrupt、SystemExit和类似的内容,它们直接来自exceptions.BaseException,而不是exceptions.Exception。有关详细信息,请参阅文档:
KeyboardInterrupt
exceptions.BaseException
exceptions.Exception
通常认为最好的做法是只抓住你感兴趣的错误。在
shutil.rmtree
的情况下,可能是OSError
:如果你想默默地忽略这个错误,你可以:
为什么?假设您(不知何故)意外地向函数传递了一个整数而不是字符串,例如:
它将给出错误“TypeError:强制为Unicode:need string或buffer,int found”-您可能不想忽略这一点,这可能很难调试。
如果您确实想忽略所有错误,请捕获
Exception
,而不是一个简单的except:
语句。再说一遍,为什么?不指定异常捕获每个异常,包括
SystemExit
异常,例如sys.exit()
使用:将其与正确退出的以下各项进行比较:
如果您想编写性能更好的代码,^{} 异常可以表示各种错误,但在上面的示例中,我们只想忽略
Errno 2
,因此我们可以更加具体:您还可以^{} 并将
if
更改为if e.errno == errno.ENOENT:
这取决于你所说的“处理”是什么意思
如果你想在不采取任何行动的情况下抓到它,你发布的代码将起作用。
如果您的意思是希望对异常执行操作,而不阻止异常向上堆栈,则需要如下所示:
或者
区别在于,第一个还将捕获
KeyboardInterrupt
、SystemExit
和类似的内容,它们直接来自exceptions.BaseException
,而不是exceptions.Exception
。有关详细信息,请参阅文档:
相关问题 更多 >
编程相关推荐