首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >处理python套接字中的超时错误

处理python套接字中的超时错误
EN

Stack Overflow用户
提问于 2012-08-08 21:33:10
回答 4查看 141.8K关注 0票数 34

我正在尝试弄清楚如何使用try和except来处理套接字超时。

代码语言:javascript
运行
复制
from socket import *

def main():
    client_socket = socket(AF_INET,SOCK_DGRAM)
    client_socket.settimeout(1)
    server_host = 'localhost'
    server_port = 1234
    while(True):
        client_socket.sendto('Message',(server_host,server_port))
        try:
            reply, server_address_info = client_socket.recvfrom(1024)
            print reply
        except socket.Timeouterror:
            #more code

我添加套接字模块的方式是导入所有内容,但是我该如何处理文档中的异常呢?它说您可以使用socket.timeouterror,但这对我不起作用。另外,如果我使用import socket,我将如何编写try异常块呢?有没有人能解释一下进口的区别。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-08-08 21:50:16

代码语言:javascript
运行
复制
from foo import * 

foo中不带前导下划线的所有名称(或仅在模块__all__属性中定义的名称)添加到当前模块中。

在上面使用from socket import *的代码中,您只是想捕获timeout,因为您已经将timeout放入了当前的名称空间。

from socket import *会引入socket中所有内容的定义,但不会添加socket本身。

代码语言:javascript
运行
复制
try:
    # socketstuff
except timeout:
    print 'caught a timeout'

许多人认为import *有问题,并试图避免它。这是因为以这种方式导入的2个或更多模块中的公共变量名将相互碰撞。

例如,考虑以下三个python文件:

代码语言:javascript
运行
复制
# a.py
def foo():
    print "this is a's foo function"

# b.py
def foo():
    print "this is b's foo function"

# yourcode.py
from a import *
from b import *
foo()

如果你运行yourcode.py,你只会看到输出"this is b‘see function“。

出于这个原因,我建议导入模块并使用它,或者从模块导入特定的名称:

例如,使用显式导入时,您的代码如下所示:

代码语言:javascript
运行
复制
import socket
from socket import AF_INET, SOCK_DGRAM

def main():
    client_socket = socket.socket(AF_INET, SOCK_DGRAM)
    client_socket.settimeout(1)
    server_host = 'localhost'
    server_port = 1234
    while(True):
        client_socket.sendto('Message', (server_host, server_port))
        try:
            reply, server_address_info = client_socket.recvfrom(1024)
            print reply
        except socket.timeout:
            #more code

只是多了一点打字,但一切都很明确,对读者来说,一切都是从哪里来的。

票数 48
EN

Stack Overflow用户

发布于 2016-09-21 03:12:36

我已经取得了足够的成功,只需要抓取socket.timeoutsocket.error即可;尽管socket.error可以因为很多原因而提高。注意。

代码语言:javascript
运行
复制
import socket
import logging

hostname='google.com'
port=443

try:
    sock = socket.create_connection((hostname, port), timeout=3)

except socket.timeout as err:
    logging.error(err)

except socket.error as err:
    logging.error(err)
票数 13
EN

Stack Overflow用户

发布于 2012-08-08 21:50:02

当您执行此操作时,from socket import *会将一个socket模块加载到当前名称空间。因此,您可以使用模块的成员,就好像它们是在当前的python模块中定义的一样。

执行import socket时,模块被加载到单独的名称空间中。当您访问它的成员时,您应该在它们前面加上一个模块名称。例如,如果要引用socket类,则需要编写client_socket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)

至于超时的问题-你所需要做的就是将except socket.Timeouterror:改为except timeout:,因为timeout类是在socket模块中定义的,并且你已经将它的所有成员导入到了你的命名空间中。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11865685

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档