6
try:
    content = my_function()
except:
    exit('Could not complete request.')

我想修改上面的代码来检查它的值content是否包含字符串。我想过使用if 'stuff' in content:or 正则表达式,但我不知道如何将它放入try; 所以如果匹配是False,它会引发异常。当然,我总是可以if在该代码之后添加一个,但有没有办法把它挤进去?

伪代码:

try:
    content = my_function()
    if 'stuff' in content == False:
        # cause the exception to be raised
except:
    exit('Could not complete request.')
4

4 回答 4

11

要引发异常,您需要使用raise关键字。我建议您在手册中阅读有关异常的更多信息。假设my_function()有时 throws IndexError,请使用:

try:
    content = my_function()
    if 'stuff' not in content:
        raise ValueError('stuff is not in content')
except (ValueError, IndexError):
    exit('Could not complete request.')

此外,你永远不应该使用except它,因为它会比你想要的更多。MemoryError例如,它将捕获KeyboardInterruptSystemExit。它会让你的程序更难被杀死(Ctrl+C不会做它应该做的事情),在低内存条件下容易出错,并且sys.exit()不会按预期工作。

更新:您也不应该只捕获Exception更具体的异常类型。SyntaxError也继承自Exception. 这意味着您文件中的任何语法错误都将被捕获并且不会正确报告。

于 2012-11-12T08:50:57.650 回答
9
try:
    content = my_function()
    if 'stuff' not in content:
        raise ValueError('stuff not in content')

    content2 = my_function2()
    if 'stuff2' not in content2:
        raise ValueError('stuff2 not in content2')

except ValueError, e:
    exit(str(e))

如果您的代码可能有多个可能的异常,您可以为每个异常定义一个特定的值。捕获它并退出将使用此错误值。

于 2012-11-12T08:47:39.827 回答
4

一个更好的方法是断言密钥在那里:

assert 'stuff' in content, 'Stuff not in content'

如果断言不正确,AssertionError则将使用给定的消息引发 an。

于 2012-11-12T09:22:26.490 回答
3

raise如果这就是您所要求的,您可以提出一个例外:

if 'stuff' not in content:
    raise ValueError("stuff isn't there")

请注意,您需要决定引发什么样的异常。在这里,我提出了 ValueError。同样,您不应该使用 bare except,而应该使用except ValueError等来仅捕获您要处理的错误类型。事实上,在这种情况下,这一点尤为重要。您可能想要区分由您引发的真正错误my_function和您正在测试的“内容不包含”条件。

于 2012-11-12T08:49:17.383 回答