2

我有这个 TCP 服务器,我希望能够接收数字(整数),但我在解决程序的一些输出时遇到了一些困难。它输出它应该输出的内容,但此外它还输出一些带有 ValueError 的回溯。我该如何解决?

Traceback (most recent call last):   File "server.py", line 18, in
<module>
    data = int(conn.recv(BUFFER_SIZE).strip()); ValueError: invalid literal for int() with base 10: ''

我在这里做的是向服务器发送整数:

    data = int(conn.recv(BUFFER_SIZE).strip());

    foo = data + 1;

    if not data: break

    print "received data:", data
    print "\n foo:", foo

这似乎很好用,但除了这两个打印件之外,我还得到了前面提到的回溯:-/

编辑:

感谢您指出这一点。由于数据(或recv)可能为空,我只是将逻辑移到if测试下,瞧……:D

        data = conn.recv(BUFFER_SIZE).strip();

        if not data: break

        command = int(data);
        foo = command + 1;
4

3 回答 3

3

正如错误消息所说,int()正在吐一个空字符串。所以检查这一点并避免调用int(),否则捕获并忽略ValueError.

策略一:

data = conn.recv(BUFFER_SIZE).strip()
if data:
    data = int(data)
    foo = data + 1
    if not data: break

策略二:

try:
    data = int(conn.recv(BUFFER_SIZE).strip());
except ValueError:
    continue
于 2012-08-05T15:10:42.203 回答
2

你的问题是你试图调用int()一个空字符串。换句话说,表达式conn.recv(BUFFER_SIZE).strip()的计算结果为''。(希望堆栈跟踪现在更有意义。)

int()您需要在调用(或将其放入块中)之前检查您是否有有效数据try/except ValueError,或者可能通过连续读取来构建字符串。

于 2012-08-05T15:10:10.970 回答
0

代替

data = int(conn.recv(BUFFER_SIZE).strip())

data = int(conn.recv(BUFFER_SIZE).strip() or 0)

以避免出现空字符串的问题。

于 2012-08-05T15:14:50.763 回答