1

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

Из того, что я прочитал здесь: Error exception must derive from BaseException even when it does (Python 2.7)

похоже, что я должен объявить его как класс. Есть ли все равно, чтобы обойти это?

+0

Вы можете показать вывод 'печати (» Здесь: «+ errorFunc» '? – Saksow

+0

'Здесь: ValueError ('ABC')' - это выход. Ошибка - это то, что я поднял вручную на стороне сервера. –

+0

Проверьте мой ответ – Saksow

ответ

1

По питона вы поднимаете что-то, не является исключением:

>>> 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 
+1

Это сработало блестяще! Спасибо. –

+0

Без проблем, приветствия! – Saksow

Смежные вопросы