0

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

有什么建议么?

4

4 回答 4

5
try:
    result = weird_func()
except TheExceptionYouWantToCatch:
    result = None

if result is None:
    #Whatever you want
于 2013-08-06T04:30:16.703 回答
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
于 2013-08-06T04:18:09.867 回答
0

falsetru 或多或少说了什么:

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 用于处理错误条件,所以添加断言,然后在一个中处理所有异常地方

于 2013-08-06T04:35:48.243 回答
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,我关闭流并确保返回。NonefinallyNone

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

于 2013-08-06T06:05:52.303 回答