想象一下,你有一个函数,在某些错误情况下会给出异常,而在某些情况下返回None(它不是由我设计的,我需要使用它)。现在,您需要处理这些错误,但是以相同的方式(向用户显示消息,记录并优雅地退出)。
我一直在做这样的事情:
try:
result = weird_func()
except:
*same functionality* do something here
if not result:
*same functionality* do the same here as in the except block
但这真的很糟糕。有没有办法巧妙地将这两者合二为一? 我一直在考虑使用try / finally,但它看起来有点奇怪。
有什么建议吗?
答案 0 :(得分:5)
try:
result = weird_func()
except TheExceptionYouWantToCatch:
result = None
if result is None:
#Whatever you want
答案 1 :(得分:1)
将结果设置为None
是一个选项。
try:
result = weird_func()
except:
result = None
if not result:
*same functinality* do the same here as in the except block
或在try
中提出异常。
try:
result = weird_func()
if not result: raise Exception() # or assert result
except:
*same functinality* do something here
答案 2 :(得分:0)
或多或少的假说:
result = wierd_func()
assert result
当结果为None时,将引发原始异常或AssertionError。只要任何封闭的尝试都可以捕获AssertionErrror以及其他任何wierd_func,那么你就是好的。
为了完整起见,还有:
try:
return wierd_func() or RuntimeError() # or whatever you'd like to raise:
except:
return sys.exc_info()[0]
在出现错误的情况下总会返回一个异常对象,所以你可以用那种方式进行恢复---但是我不打扰:try / catch用于处理错误条件所以添加断言然后处理所有在一个地方的例外
答案 3 :(得分:0)
我通常使用与Lennart Regebro的答案相同的模式。对于一些不常见的情况,尤其是那些与文件有关的情况,我有时会使用稍微修改过的版本,如下所示:
to_close = None
stream = None
try:
to_close = open(path, mode)
stream = to_close
if validate_open_stream(stream):
to_close = None
finally:
if to_close is not None:
to_close.close()
stream = None
return stream
这个特殊的序列允许我打开一个文件(如果文件无法打开,可能会引发IOError
),然后以某种方式检查它 - 确保它有一个正确的“幻数”,例如 - 然后返回打开的流以供进一步使用。如果在文件打开时出现问题,to_close
在None
子句中不是finally
,我会关闭该流并确保返回None
。
(通常情况下,上下文管理器更适合这种情况;我对Python 2.4及更早版本更需要这种模式。)