分布式系统:提升客户端服务器端抛出的错误

时间:2017-02-01 10:10:06

标签: python python-3.x error-handling distributed-system raiserror

我刚刚开始创建一个分布式系统,现在只有一台服务器和一堆客户端。使用的语言是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)

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

1 个答案:

答案 0 :(得分: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