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

4 投票
2 回答
2536 浏览
提问于 2025-04-15 19:14

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

这其实是一个关于命令行重定向的问题,而不是Python的问题。

当你这样写的时候:

python foobar 2>&1 >> foobar.log

首先把错误信息(stderr)重定向到了标准输出(stdout),然后第二把标准输出重定向到了foobar.log文件。这样一来,错误信息并不会自动重定向到foobar.log文件里,它仍然指向原来的标准输出。

所以你应该这样做:

python foobar >> foobar.log 2>&1 

你可以查看这个链接了解更多信息:http://bash-hackers.org/wiki/doku.php/syntax/redirection(搜索“多个重定向”)

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

如你所见,第一部分会写入标准输出,所以 &2>1 并没有完全生效。如果你想要停止这些记录,可以重写或者覆盖那个方法。

撰写回答