1

Je viens de commencer à créer un système distribué qui dispose désormais d'un serveur unique et de plusieurs clients. La langue utilisée est python et la communication est faite en utilisant des sockets et JSON. Lorsqu'une erreur se produit sur le côté serveur que j'envoie la classe nom d'erreur et les arguments d'erreur du côté client comme ceci:Système distribué: augmentation de l'erreur côté serveur côté client

 except Exception as e: 
     jsonResult = {"error":                     
         { 
          "name":e.__class__.__name__,               
          "args": e.args                  
         }                       
     }                          

     jsonResult = json.dumps(jsonResult)                  
     jsonResult += "\n"                      

     return jsonResult 

et puis essayer de soulever sur le côté client comme ceci:

  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) 

Quand je fais cela, je reçois l'erreur

TypeError: exceptions must derive from BaseException 

D'après ce que je lis ici: Error exception must derive from BaseException even when it does (Python 2.7)

il semble que je dois le déclarer en tant que classe. Y a-t-il moyen de contourner cela?

+0

Pouvez-vous montrer la sortie de 'print (» Ici: "+ errorFunc" '? – Saksow

+0

'Ici: ValueError ('ABC')' est la sortie. L'erreur est celle que j'ai soulevée manuellement sur le serveur. –

+0

Vérifiez ma réponse – Saksow

Répondre

1

Selon python vous élevez quelque chose qui ne fait pas exception:

>>> type(exec("ValueError('ABC')")) 
<class 'NoneType'> 

Vous devez réécrire votre code pour avoir ceci:

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

Cela a fonctionné avec brio! Merci beaucoup. –

+0

Pas de problème, bravo! – Saksow