如何在 try-except-else 语句中引发异常

How to raise an exception in a try-except-else statement

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

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

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,它会引发异常并移至下一个。如果 >=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:
    assert x >= 2
    print("processing this quad")
except:
    print("only one quad")
    print("moving to next quad")

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

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

您不能简单地 提出 错误并继续前进。您需要 ignore/handle/log 错误并继续前进。顺便说一句,在大多数情况下,您不需要带有 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

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

尝试 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")