我正在测试python上的服务器差异。当我仅使用1台服务器进行测试时,会出现错误。有没有办法尝试/捕获此问题:
# 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的新手。
编辑:这是我的calc_average函数。我认为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")
edit 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:在字符串格式化期间并非所有参数都已转换
答案 0 :(得分:2)
如错误消息所示,您对calc_average(server)
的调用返回了None
,并且您尝试从server_time_differences[server]
中减去其返回值的尝试失败了,因为浮点数不能与{{ 1}}。
从您的None
代码来看,很明显,只有在calc_average
出现时,它才会返回None
,因为ZeroDivisionError
块中没有显式的return语句。您可能没有注意到正在打印消息except
的原因可能是因为它与'error'
异常的回溯混合在一起,因为标准错误在标准输出时(在您的ZeroDivisionError
消息中没有缓冲)去)被缓冲。
由于错误的性质,'error'
发生时不应返回任何值,因为对于调用者而言,继续进行有意义的计算没有任何意义。相反,它应该重新引发一个更友好的异常,并让调用者捕获该异常并以更优美的方式打印错误消息:
ZeroDivisionError