Python类型/浮点捕获

2024-03-29 08:54:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在python上测试服务器差异。当我只使用一台服务器进行测试时,会出现错误。有没有办法尝试/抓住这个:

# Discrepancy = abs(this server's difference - average of differences of all the other servers

for server in server_time_differences:
    discrepancies[server] = abs(server_time_differences[server] - calc_average(server))

这是我得到的错误:

discrepancies[server] = abs(server_time_differences[server] - calc_average(server))

TypeError:不支持-:“float”和“NoneType”的操作数类型

如果你需要更多的信息,请告诉我。谢谢你的帮助,我是Python新手

编辑:这是我的计算平均值函数。我想try/except是不正确的

# Function that calculates average time difference for the servers
def calc_average(server_name):
#Temporarily copies time differences to use for this function
temp = server_time_differences.copy()
temp.pop(server_name)
sum_ = sum(temp.values())
# Average = sum of servers divided by number of used servers
try: 
    return sum_ / len(temp.keys())
except ZeroDivisionError:
    print("error")

编辑2:新错误 好吧,我还是有个错误:

in calc_average return sum_ / len(temp.keys()) 

ZeroDivisionError:被零除

在处理上述异常时,发生了另一个异常:

in <module> discrepancies[server] = abs(server_time_differences[server] - calc_average(server))  

以及

in calc_average raise RuntimeError ('No other servers to compare with ' %server_name)  

TypeError:不是所有参数都在字符串格式化期间转换


Tags: ofnameinforservertime错误calc
1条回答
网友
1楼 · 发布于 2024-03-29 08:54:23

如错误消息所示,对calc_average(server)的调用返回None,而从server_time_differences[server]中减去其返回值的尝试失败,因为浮点数不能与None一起操作

calc_average的代码中可以明显看出,它只会在ZeroDivisionError发生时返回None,因为except块中没有显式的return语句。您可能没有注意到正在打印的消息'error'可能是因为它与ZeroDivisionError异常的跟踪混合在一起,因为标准错误在缓冲标准输出(您的'error'消息所在的位置)时是无缓冲的

由于错误的性质,当ZeroDivisionError发生时不应返回值,因为调用方继续有意义的计算没有任何值是有意义的。相反,它应该重新引发一个更友好的异常,并让调用方捕获该异常并以更优雅的方式打印错误消息:

def calc_average(server_name):
    temp = server_time_differences.copy()
    temp.pop(server_name)
    sum_ = sum(temp.values())
    try: 
        return sum_ / len(temp.keys())
    except ZeroDivisionError:
        raise RuntimeError('No other server available to calculate average server time difference with %s.' % server_name)

for server in server_time_differences:
    try:
        discrepancies[server] = abs(server_time_differences[server] - calc_average(server))
    except RuntimeError as e:
        print(e)

相关问题 更多 >