如何有效地捕获异常并检查参数是否为None

时间:2013-08-06 04:13:48

标签: python exception-handling

想象一下,你有一个函数,在某些错误情况下会给出异常,而在某些情况下返回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,但它看起来有点奇怪。

有什么建议吗?

4 个答案:

答案 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_closeNone子句中不是finally,我会关闭该流并确保返回None

(通常情况下,上下文管理器更适合这种情况;我对Python 2.4及更早版本更需要这种模式。)