Серверы Python NoneType / float catch - PullRequest
       3

Серверы Python NoneType / float catch

0 голосов
/ 11 сентября 2018

Я тестирую несоответствия сервера на 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.

edit: вот моя функция calc_average. Я предполагаю, что попытка / исключение неверна

# 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: не все аргументы преобразованы во время форматирования строки

1 Ответ

0 голосов
/ 11 сентября 2018

Как показывает ваше сообщение об ошибке, ваш вызов calc_average(server) возвращает None, и ваша попытка вычесть его возвращаемое значение из server_time_differences[server] не удалась, поскольку плавающее число не может работать с None.

Из вашего кода для calc_average очевидно, что он вернет None только тогда, когда произойдет ZeroDivisionError, поскольку в блоке except нет явного оператора возврата. Возможно, причина, по которой вы не заметили печатное сообщение '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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...