如何在 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")
我有一个决策函数,如果输入的长度小于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")