gpt4 book ai didi

python - 处理多个相同类型的异常并在 python 中恢复执行

转载 作者:太空宇宙 更新时间:2023-11-03 10:59:51 25 4
gpt4 key购买 nike

一旦您在 Python 中引发用户定义的异常,似乎就无法恢复测试的执行。但在我的场景中,我想检查不同输入值发生的错误。但是当前的实现限制继续对不同的输入向量进行错误检查。

但是,在为我的问题提出某种复杂的解决方案之前,我想我会问问专家,看看是否有什么我遗漏的。 不幸的是,如果不进行重大重构,我无法轻易改变这种范式

我的应用程序看起来类似于:

  • 输入将作为 numGen 函数给出。此 numGen 函数将输入添加到随机数。在我的示例中,我正在检查 10 个不同的随机数。
  • 注意输入也将随着随机数生成的范围而变化

问题陈述:

  • 我想检查每个输入是否发生错误,如果发生任何错误则引发异常并存储哪个输入的信息

  • 对于其他输入也继续执行程序,但是在我的实现中我无法继续进一步执行。

问题:

  • 如何在不使用 unittest 模块的情况下引发异常?

从随机导入 randint

class RND_ERROR(Exception):
def __init__(self, ErrNum, *arg, **kwargs):
self.RND_ERR_NR = int(ErrNum)
self.RND_ERR_MSG = ""
if self.RND_ERR_NR == 0x00000000:
self.RND_ERR_MSG = "NO ERROR"
elif self.RND_ERR_NR == 0x00000001:
self.RND_ERR_MSG = "RANDOM NUMBER IS ONE"
elif self.RND_ERR_NR == 0x00000002:
self.RND_ERR_MSG = "RANDOM NUMBER IS TWO"
elif self.RND_ERR_NR == 0x00000003:
self.RND_ERR_MSG = "RANDOM NUMBER IS THREE"
else:
self.RND_ERR_MSG = "RANDOM NUMBER GREATER THAN THREE"
def __str__(self):
return "RND ERROR (0x%08X): %s" % (self.RND_ERR_NR,self.RND_ERR_MSG)

def __repr__(self):
return self.__str__()

def check_error(b):
print "dict",b
count = 0

for i, error_nr in b.items():

error_nr = error_nr % 2
print "key:val",i, error_nr
if error_nr ==0:
count = count +1
# print count
elif error_nr > 0:

# print error_nr
raise RND_ERROR(error_nr)

def numGen(input):
from random import randint
result= {}
for i in range(9):
j = (randint(0,4))
result[i] = input+j
result.update()
check_error(result)

if __name__ == '__main__':
try:
numGen(3)
except BaseException as e:
print e

Output1: # Since at the 6th input error occurred and execution stopped **(Some what Best case)**
dict {0: 6, 1: 6, 2: 6, 3: 6, 4: 4, 5: 6, 6: 3, 7: 3, 8: 7}
key:val 0 0
key:val 1 0
key:val 2 0
key:val 3 0
key:val 4 0
key:val 5 0
key:val 6 1
RND ERROR (0x00000001): RANDOM NUMBER IS ONE

**Output2:**
dict {0: 7, 1: 6, 2: 4, 3: 3, 4: 6, 5: 6, 6: 7, 7: 5, 8: 4}
key:val 0 1

RND ERROR (0x00000001): RANDOM NUMBER IS ONE

Expected Output:

Input1 - Pass
Input2 - Pass
Input3 - Pass
Input4 - Pass
Input5 - Pass
Input6 - RANDOM IS TWO (exception occurred)
Input7 - Pass # execution continued for next input check
Input8 - Pass
Input9 - RANDOM IS ONE (exception occurred)
Input10 - Pass # execution continued for next input check

我找到了链接,它看起来与我的要求相似。不同之处在于不检查文件读取中的错误,如果发现错误则将其堆叠起来。在我的例子中,它正在检查输入。

Similar requirement

提前致谢!

最佳答案

您定义的是一个逻辑矛盾:您想要引发异常并继续正常执行。第 4 代语言中 raise exception 的常见含义意味着您不想继续正常执行。下定决心。

欢迎您打印消息,引发异常,并继续正常操作。如果您想稍后引发异常,欢迎您这样做。

如果要检查每个输入的错误,则不能使错误检查本身成为异常条件。我在这里有点猜测:您想报告每一个差异,但在您完成所有输入案例之前不要引发异常。试试这个:它将错误处理拆分为非异常例程。我完整地保留了您的许多异常处理内容,以防您想用其他代码填充它。

class RND_ERROR(Exception):
def __init__(self, ErrNum, *arg, **kwargs):
self.RND_ERR_NR = int(ErrNum)
self.RND_ERR_MSG = ""

def __str__(self):
return "RND ERROR (0x%08X): %s" % (self.RND_ERR_NR,self.RND_ERR_MSG)

def __repr__(self):
return self.__str__()


def handle_error(ErrNum):
RND_ERR_NR = int(ErrNum)
RND_ERR_MSG = ""
if RND_ERR_NR == 0x00000000:
RND_ERR_MSG = "NO ERROR"
elif RND_ERR_NR == 0x00000001:
RND_ERR_MSG = "RANDOM NUMBER IS ONE"
elif RND_ERR_NR == 0x00000002:
RND_ERR_MSG = "RANDOM NUMBER IS TWO"
elif RND_ERR_NR == 0x00000003:
RND_ERR_MSG = "RANDOM NUMBER IS THREE"
else:
RND_ERR_MSG = "RANDOM NUMBER GREATER THAN THREE"

print "RND ERROR (0x%08X): %s" % (RND_ERR_NR, RND_ERR_MSG)

def check_error(b):
print "dict",b
count = 0
need_exception = False

for i, error_nr in b.items():

error_nr = error_nr % 2
print "key:val",i, error_nr
if error_nr ==0:
count = count +1
# print count
elif error_nr > 0:
# print error_nr
handle_error(error_nr)
need_exception = True

if need_exception:
raise RND_ERROR(49374)


def numGen(input):
from random import randint
result= {}
for i in range(9):
j = (randint(0, 4))
result[i] = input+j
result.update()
# print "iteration", i, j
check_error(result)

try:
numGen(3)
except BaseException as e:
print e
finally:
print "Finished"

输出:

dict {0: 6, 1: 4, 2: 6, 3: 5, 4: 4, 5: 4, 6: 5, 7: 6, 8: 3}
key:val 0 0
key:val 1 0
key:val 2 0
key:val 3 1
RND ERROR (0x00000001): RANDOM NUMBER IS ONE
key:val 4 0
key:val 5 0
key:val 6 1
RND ERROR (0x00000001): RANDOM NUMBER IS ONE
key:val 7 0
key:val 8 1
RND ERROR (0x00000001): RANDOM NUMBER IS ONE
RND ERROR (0x0000C0DE):
Finished

关于python - 处理多个相同类型的异常并在 python 中恢复执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35089487/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com