Распределенная система: выдает ошибку на стороне сервера на стороне клиента
Я только начал создавать распределенную систему, в которой теперь есть один сервер и группа клиентов. Используемый язык - Python, а связь осуществляется с помощью сокетов и JSON. Когда на стороне сервера происходит ошибка, я отправляю имя класса ошибки и аргументы ошибки на сторону клиента следующим образом:
except Exception as e:
jsonResult = {"error":
{
"name":e.__class__.__name__,
"args": e.args
}
}
jsonResult = json.dumps(jsonResult)
jsonResult += "\n"
return jsonResult
А затем попробуйте поднять его на стороне клиента следующим образом:
errorFunc = decodedReply["error"]["name"]
args = decodedReply["error"]["args"]
print (args)
# Builds and appends the argumentstring to the error class-name.
errorFunc += '('
for arg in args:
# Handles when the argument is a string.
if isinstance(arg, str):
errorFunc += '\'' + arg + '\','
else:
errorFunc += arg + ','
# Removes the extra ',' from the string before adding the last ')'.
errorFunc = errorFunc[:-1]
errorFunc += ')'
# Debugging print.
print ("Here: " + errorFunc)
raise exec(errorFunc)
Когда я делаю это, я получаю ошибку
TypeError: exceptions must derive from BaseException
Из того, что я прочитал здесь: исключение ошибки должно происходить из BaseException, даже если это происходит (Python 2.7)
похоже, я должен объявить это как класс. Есть ли способ обойти это?
1 ответ
Решение
Согласно Python, вы поднимаете что-то, что не является исключением:
>>> type(exec("ValueError('ABC')"))
<class 'NoneType'>
Вам нужно переписать свой код, чтобы иметь это:
>>> errorFunc = "ValueError('ABC')"
>>> exec('raise ' + errorFunc)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<string>", line 1, in <module>
ValueError: ABC