Как справиться с пользовательским исключением с помощью Pyro4?

#python #python-3.x #pyro4

#python #python-3.x #pyro4

Вопрос:

Я пытаюсь представить свои классы с помощью Pyro4. Проблема в том, что в моем классе есть пользовательское исключение, которое Pyro4 не может обработать.

Я пробовал использовать сериализацию, но, похоже, ничего не работает.

Что у меня есть:

 # exception class
class TestException(Expection):
    pass


# test class
@Pyro4.expose
class Test:

   def get_exception(self):
       raise TestException("This is a random exception.")
  

Pyro4 не может вызвать исключение TestException. Это выдает мне ошибку:
{SerializedError}неподдерживаемый сериализованный класс: TestException

У кого-нибудь есть идея, как это исправить?

Спасибо.

Ответ №1:

Вам нужно будет научить Pyro (или, скорее, базовый Serpent serializer), что вы согласны десериализовать свой пользовательский класс исключений, и как он должен это делать. В зависимости от этого вам также может потребоваться убедиться, что обе стороны (клиент и сервер) имеют доступ к одному и тому же исходному модулю, который определяет ваш класс TestException.

Это в документации. В частности, https://pyro4.readthedocs.io/en/stable/clientcode.html#changing-the-way-your-custom-classes-are-de-serialized

Из соображений безопасности это вызывает ошибку и требует усилий программиста. (Десериализация случайных классов, которые вы получаете из сети, опасна)

В конце концов, может быть проще просто перехватить исключение на вашем сервере Pyro и вместо этого вызвать одно из стандартных исключений Python.