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

从我在这里读到的内容:错误异常必须从 BaseException 派生,即使它确实如此(Python 2.7)

看起来我必须将它声明为一个类。有没有办法解决这个问题?

4

1 回答 1

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
于 2017-02-01T11:10:58.853 回答