【问题标题】:Python Servers NoneType/float catchPython 服务器 NoneType/float catch
【发布时间】:2018-09-11 11:22:50
【问题描述】:

我正在 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")

编辑 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:字符串格式化期间并非所有参数都转换

【问题讨论】:

  • 您看到error 打印出来了吗?如果你发现异常,你将不得不返回一些东西
  • 不,错误不会被打印出来
  • calc_average 的缩进级别是正确的,还是在复制到 SO 时弄乱了?
  • 是的,没错,只是搞砸了
  • 刚刚搞砸了 SO*

标签: python server


【解决方案1】:

正如您的错误消息所示,您对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)

【讨论】:

  • 抱歉我想发布我的 calc_average 函数
  • 如果您不介意查看我的 calc_average 函数,请编辑我的原始问题。
  • 好的,所以我仍然遇到错误:在 calc_average return sum_ / len(temp.keys()) 。 ZeroDivisionError: 除以零 在处理上述异常期间,发生了另一个异常:在 discrepancies[server] = abs(server_time_differences[server] - calc_average(server)) 和在 calc_average raise RuntimeError ('No other servers to compare with ' %server_name) TypeError: 在字符串格式化期间并非所有参数都转换了
  • 我只是要发布原始问题中的新错误... 更新原始问题
  • 嗯,,,我删除了“%server_name”,错误就消失了。
猜你喜欢
  • 1970-01-01
  • 2019-06-19
  • 2020-06-19
  • 1970-01-01
  • 2014-05-10
  • 1970-01-01
  • 1970-01-01
  • 2020-11-10
  • 1970-01-01
相关资源
最近更新 更多