【问题标题】:How to raise an exception in a try-except-else statement如何在 try-except-else 语句中引发异常
【发布时间】:2021-11-09 14:54:11
【问题描述】:

我有一个决策函数,如果输入的长度小于 2,则会引发错误并移动到下一个输入;如果输入的长度> = 2,则没有错误并且执行此输入。但是,我有在这个 try-except-else 中添加 raise-exception 的问题。

一个非常简化的版本是这样的:

x = 3
try:
    assert (x < 2)
    print("only one class")
except:
    assert(x > 1)
    print("processing this quad")
else:
    print("moving to next quad")
# output is "processing this quad"

x = 1
try:
    assert(x < 2)
    print("only one class")
except:
    assert(x > 1)
    print("processing this quad")
else:
    print("moving to next quad")
# output is "only one class
moving to next quad"

理想情况下,我的 raise 异常会以同样的方式工作。如果输入 =2,则处理此输入。但是,似乎异常引发与 Else 不兼容,我收到以下错误。 (输入是一个名为 unique_cc 的列表的长度。这里,unique_cc = 1)。 我希望它引发异常,然后打印“移至下一个”。有人帮我解决这个问题吗?

    try:
        assert(len(unique_cc) < 2)
        raise Exception("Data has only 1 non-zero class - rejected for random forest.")
    except:
        assert(len(unique_cc) > 1)
        print("processing this quad")
    else:
        print("moving to next quad")

【问题讨论】:

  • 嗯,是的 - 这就是引发异常的全部要点:分解本地控制流并让下一个异常处理程序决定接下来应该发生什么。 try/except/else 上的else 块的全部要点 是包含仅在try 块不 引发时发生 的代码一个例外。我不明白你希望它如何工作,或者你希望通过这种方式解决什么问题。
  • " 引发错误并移至下一个输入" 因此没有意义。如果你想显示一个错误,那么你可以使用例如print。但是 raise 的全部意义在于声明在逻辑上不可能 只是“移动到下一个输入”。您无法在本地处理的问题除外。
  • 使用 if 语句。 try-except 块不适用于常见的逻辑门。
  • 您可能不想将 assert 用于运行时逻辑。优化的 Python 运行时(即使用 -O 选项启动时)禁用断言
  • 嗨@KarlKnechtel,我特别想要一个错误,因为我需要在数据库中记录错误 - 然后数据库会做一些事情 - 另一个不相关的故事。

标签: python error-handling try-except


【解决方案1】:

尝试带有错误消息的 Python 断言关键字

while True: 
    unique_cc = 0
    try:
        unique_cc = int(input("Please enter a number: "))
        #break
    except ValueError:
        print("Oops!  That was no valid number.  Try again...")

    assert unique_cc < 2, "Data has only 1 non-zero class - rejected for random forest."
        # raise  Exception("Data has only 1 non-zero class - rejected for random forest.")
    assert unique_cc > 1, "processing this quad"
    break
print("moving to next quad")


【讨论】:

  • 谢谢!我在发布问题后开了个会,并意识到唯一和最​​好的方法是拥有外部和内部功能。这正是我切换到的方法。
  • 不客气,祝你好运。
【解决方案2】:
try:
    assert x >= 2
    print("processing this quad")
except:
    print("only one quad")
    print("moving to next quad")

如果您只希望它在 x 的值小于 2 时打印“移动到下一个四边形”,那么这应该可以满足您的需求。如果 assert 语句失败,则立即跳转到 except 子句。

我应该指出,通常一个简单的 if else 语句可以很好地处理这个问题,而不是一个引发异常的断言。除非你想让它表现得更像一个单元测试,比如抛出一个自定义的失败异常

【讨论】:

    【解决方案3】:

    您不能简单地提出错误并继续前进。您需要忽略/处理/记录错误并继续。顺便说一句,在大多数情况下,您不需要带有 try 子句的 else 子句。在大多数情况下,如果您将其放在 try 子句的末尾,则没有什么区别。

    还要确保只在 except 子句中使用 logging.exception。 否则可能会导致意想不到的怪异行为。

    “记录错误并继续”的例子:

    import logging
    for i in range(5):
        try:
            assert(1 == i)
            print("try", i)
        except Exception:
            logging.exception("error")
        else:
            assert(1 == 1)
            print("else", i)
        finally:
            print("finally", i, "\n")
    print("end")
    

    输出:

    ERROR:root:error
    Traceback (most recent call last):
      File "<string>", line 6, in <module>
    AssertionError
    finally 0 
    
    try 1
    else 1
    finally 1 
    
    ERROR:root:error
    Traceback (most recent call last):
      File "<string>", line 6, in <module>
    AssertionError
    finally 2 
    
    ERROR:root:error
    Traceback (most recent call last):
      File "<string>", line 6, in <module>
    AssertionError
    finally 3 
    
    ERROR:root:error
    Traceback (most recent call last):
      File "<string>", line 6, in <module>
    AssertionError
    finally 4 
    
    end
    

    您也可以将记录错误结果保存在单独的文件中,以便输出更清晰

    【讨论】:

      猜你喜欢
      • 2016-02-12
      • 1970-01-01
      • 1970-01-01
      • 2020-07-06
      • 1970-01-01
      • 2023-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多