代码之家  ›  专栏  ›  技术社区  ›  Nick Bolton

如何处理python xml-rpc输出和异常?

  •  4
  • Nick Bolton  · 技术社区  · 15 年前

    我创造了一个简单的 Python XML-RPC 实现,主要基于示例。

    但是,它发送这样的输出:

    foo.bar.com - - [13/Feb/2010 17:55:47] "POST /RPC2 HTTP/1.0" 200 -
    

    …到终端,即使我将标准输出和标准错误重定向到使用 >> > . 我用下面的一行来做这个:

    python foobar 2>&1 >> foobar.log
    

    似乎它不是发送到标准输出,而是其他地方。

    此外,当接收请求时发生异常时,整个应用程序将崩溃,并出现以下错误:

    ----------------------------------------
    Exception happened during processing of request from ('1.2.3.4', 51284)
    

    我如何处理这个异常?我需要优雅地恢复,只需记录异常消息,而不是服务器崩溃。

    2 回复  |  直到 15 年前
        1
  •  5
  •   AndiDog    15 年前

    我猜你用的是 SimpleXMLRPCServer 从示例中类。在这种情况下,只需提供参数 logRequests 创建时:

    server = SimpleXMLRPCServer(("localhost", 8000), logRequests = False)
    

    这将禁止请求日志记录。

    至于例外情况,他们已经登录 BaseServer (参见“socketserver.py”的源代码):

    def handle_error(self, request, client_address):
        """Handle an error gracefully.  May be overridden.
    
        The default is to print a traceback and continue.
    
        """
        print '-'*40
        print 'Exception happened during processing of request from',
        print client_address
        import traceback
        traceback.print_exc() # XXX But this goes to stderr!
        print '-'*40
    

    如您所见,第一部分是写在stdout中的,这就是为什么 &2>1 没有完全发挥作用。如果要抑制它们,请重写或覆盖该方法。

        2
  •  0
  •   unutbu    15 年前

    这实际上是一个shell重定向问题,而不是Python问题。 当你说

    python foobar 2>&1 >> foobar.log
    

    你是 第一 将stderr重定向到stdout,然后 第二 正在将stdout重定向到foobar.log。 stderr不会自动重定向到foobar.log。stderr仍然指向原始stdout。

    因此,改为这样做:

    python foobar >> foobar.log 2>&1 
    

    也见 http://bash-hackers.org/wiki/doku.php/syntax/redirection (搜索“多个重定向”)。

    推荐文章