Joh*_*nck 5 python exception-handling exception pep python-3.x
在系统编程中,通常会调用某些可能失败的库函数,如果失败,则检查errno确切原因.即使在Python中也是如此,我认为它比它需要的更麻烦.让我们以一些试图删除文件的代码为例,如果文件不存在则继续静默:
try:
sftp.unlink(path)
except IOError as ex:
if ex.errno != errno.ENOENT:
raise
Run Code Online (Sandbox Code Playgroud)
我想知道在Python中是否曾经允许或建议它做更像这样的事情:
try:
sftp.unlink(path)
except IOError as ex if ex.errno == errno.ENOENT:
pass
Run Code Online (Sandbox Code Playgroud)
我认为这有一些建议:
如果之前没有考虑到这一点,我会感到惊讶,所以我会接受任何过去或未决提案的链接.我也接受一个答案,解释为什么上面会引入现有语言的任何问题(Python 3.x,因为我认为2.x主要是冻结的).
我怀疑你会在这个建议上走得太远,但你可以通过上下文管理器得到你想要的东西。尝试这个:
import os
class SuppressOSError(object):
def __init__(self, *valid_errno):
self.valid_errno = valid_errno
def __enter__(self):
return self
def __exit__(self, ex_type, ex_value, traceback):
if issubclass(ex_type, OSError) and ex_value.errno in self.valid_errno:
return True # suppress exception
with SuppressOSError(os.errno.ENOENT):
os.remove('/tmp/no_such_file')
print("This line will not be reached.")
print("An exception was not raised.")
Run Code Online (Sandbox Code Playgroud)
上面打印“未引发异常”。
您可以传入任意数量的errno值;在我的例子中,我刚刚传递了一个。在 Python 2.7.4 中测试,应该适用于任何 Python 2.5 或更高版本。
| 归档时间: |
|
| 查看次数: |
116 次 |
| 最近记录: |