如何处理Python XML-RPC输出和异常?

时间:2010-02-13 18:05:10

标签: python xml-rpc

我创建了一个简单的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 个答案:

答案 0 :(得分:5)

我猜您正在使用示例中的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无法完全运行的原因。如果要禁止它们,请覆盖或覆盖该方法。

答案 1 :(得分:0)

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

python foobar 2>&1 >> foobar.log

首先将stderr重定向到stdout,然后 second 将stdout重定向到foobar.log。 stderr不会自动重定向到foobar.log。 stderr仍然指向原来的标准输出。

所以改为:

python foobar >> foobar.log 2>&1 

另请参阅http://bash-hackers.org/wiki/doku.php/syntax/redirection(搜索“多重重定向”)