如果函数有效则为 true,如果函数出错则为 false

Ign*_*asi 6 python error-handling built-in

python(内置函数或其他东西)有什么方法可以检查函数执行是否由于错误或工作而失败?并根据情况返回 true 或 false

我期望发生的情况的示例:

内置方法示例:iserror

iserror(float('123')) #returns False, as no error on float('123') occurs
iserror(float('as1f')) #returns True, as it is not possible to convert to float the string ('as1f')
Run Code Online (Sandbox Code Playgroud)

Mar*_*ers 5

没有这样的功能。您无法构建一个执行您要求的操作的函数,因为当 Python 调用 时iserror()float('123')orfloat('as1f')表达式已经执行;如果在那里引发异常,iserror()则永远不会执行。

您必须将调用委托给该函数:

def iserror(func, *args, **kw):
    try:
        func(*args, **kw)
        return False
    except Exception:
        return True
Run Code Online (Sandbox Code Playgroud)

然后像这样使用它:

iserror(float, '123')   # False
iserror(float, 'as1f')  # True
Run Code Online (Sandbox Code Playgroud)

然而捕获所有错误并不是一个好主意。尽管上面的函数尝试通过 catch 来做正确的事情Exception(从而避免捕获SystemExitor KeyboardInterrupt),但它catch MemoryError,这表明您耗尽了内存,而不是您测试的函数的参数是错误的!

始终尝试捕获特定的异常;您可以扩展iserror()以接受特定的例外:

def iserror(func, *args, **kw):
    exception = kw.pop('exception', Exception)
    try:
        func(*args, **kw)
        return False
    except exception:
        return True
Run Code Online (Sandbox Code Playgroud)

然后只捕获ValueError来测试你的float()调用:

iserror(float, '123', exception=ValueError)   # False
iserror(float, 'as1f', exception=ValueError)  # True
Run Code Online (Sandbox Code Playgroud)

这不再是那么可读了。无论您想要使用可能引发异常的函数调用,我都会坚持使用简单的内联try..except,因为这样您就可以根据特定异常定制响应,而无需在确定不会出现异常后重复处理结果是一个错误:

while True:
    value = raw_input('Please give a number: ')
    try:
         value = int(value)
         break
    except ValueError:
         print "Sorry, {} is not a valid number, try again".format(value)
Run Code Online (Sandbox Code Playgroud)