【问题标题】:Can I raise an exception if a statement is False?如果语句为 False,我可以引发异常吗?
【发布时间】:2012-10-31 16:37:43
【问题描述】:
try:
    content = my_function()
except:
    exit('Could not complete request.')

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

伪代码:

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

【问题讨论】:

  • 是的,你可以。参考手册raising-exceptions
  • 你不应该像这样捕获所有异常。它将隐藏所有语法和其他编程错误,调试将是一场噩梦。指定要捕获的异常类型(类)。

标签: python exception try-catch


【解决方案1】:

要引发异常,您需要使用raise 关键字。我建议您在manual 中阅读更多关于异常的信息。假设my_function() 有时会抛出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,因为它会捕获比你想要的更多的东西。例如,它将捕获MemoryErrorKeyboardInterruptSystemExit。它会让你的程序更难被杀死(Ctrl+C 不会做它应该做的事情),在低内存条件下容易出错,并且sys.exit() 不会无法按预期工作。

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

【讨论】:

  • 捕捉Exception 等于捕捉(几乎)任何东西。 Exception 是大多数内部和所有用户定义异常的基类。
  • 在最近的版本 (> 2.5) 中,KeyboardInterruptSystemExit 实际上继承自 BaseException,因此它们不会被捕获。但我同意,通常最好不要撒这么大的网。
  • 忘记了SyntaxError。你是对的,这还不够好。
【解决方案2】:

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

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

如果断言不成立,AssertionError 将与给定消息一起引发。

【讨论】:

  • assert 是一种不好的做法,因为用户可以通过使用 -O 作为参数启动 python 来禁用任何和所有 asserts。
  • 我发现这在数据分析笔记本中用于检查计算是否符合预期很有用。这是一个简单、干净的单行代码,代码不会使用-O
【解决方案3】:

如果这是您的要求,您可以使用 raise 引发异常:

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

请注意,您需要决定引发什么样的异常。在这里,我提出了 ValueError。同样,您不应使用纯except,而应使用except ValueError 或类似名称,仅捕获您要处理的错误类型。事实上,在这种情况下,这一点尤为重要。您大概想区分my_function 引发的真正错误和您正在测试的“内容不存在”的情况。

【讨论】:

    【解决方案4】:
    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))
    

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

    【讨论】:

      猜你喜欢
      • 2014-07-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-18
      • 1970-01-01
      • 2018-03-15
      • 2015-12-30
      • 1970-01-01
      相关资源
      最近更新 更多