Распределенная система: выдает ошибку на стороне сервера на стороне клиента

Я только начал создавать распределенную систему, в которой теперь есть один сервер и группа клиентов. Используемый язык - 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
Другие вопросы по тегам