Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python套接字编程-异常处理_Python_Sockets_Tcp_Client - Fatal编程技术网

Python套接字编程-异常处理

Python套接字编程-异常处理,python,sockets,tcp,client,Python,Sockets,Tcp,Client,我正在用python编写一个基本的套接字客户端程序,但我不完全确定如何处理异常。这就是我到目前为止所做的: TCP_IP = '..............' TCP_PORT = 4950 MESSAGE = "o3" BUFFER_SIZE = 2048 data = "" s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.settimeout(5.0) try: s.conne

我正在用python编写一个基本的套接字客户端程序,但我不完全确定如何处理异常。这就是我到目前为止所做的:

TCP_IP      = '..............'
TCP_PORT    = 4950
MESSAGE     = "o3"
BUFFER_SIZE = 2048
data        = ""

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

s.settimeout(5.0)

try:
    s.connect((TCP_IP, TCP_PORT))
except socket.error:
    #write error code to file
    s.close()

try:
    s.sendall(MESSAGE)
except socket.error:
    #write to file or whatever
    s.close()

try:
    data = s.recv(BUFFER_SIZE)
except socket.error:
    #write to file or whatever
    s.close()

finally:
    s.close()
代码正在按我所希望的方式工作,但我不确定是否应该嵌套try/catch块?我是否应该将
socket.socket
也放入try/catch块


第二个问题,在我的情况下,
s.settimeout()
将做什么?据我对文档的理解,它将在5秒后抛出异常,但原因是什么?只需
连接
,还是将对
发送所有
recv
执行相同的操作

由于您在所有异常块中执行完全相同的操作并捕获相同的
socket.error
异常,因此可以将
s.connect
s.sendall
s.recv
放在相同的
块中尝试:
尝试。像这样:

try:
    s.connect((TCP_IP, TCP_PORT))
    s.sendall(MESSAGE)
    data = s.recv(BUFFER_SIZE)
except socket.error:
    #write error code to file
finally:
    s.close()
请注意,由于示例中的
s.close
也位于
finally
部分,因此即使发生异常,也会始终调用它。因此,当您试图关闭一个已经关闭的套接字时,会出现另一个异常。通过不将其放在
块中,而只放在
最后
中,可以避免这种情况

如果您确实打算以不同的方式处理每个错误,那么您可以将它们分开,就像您已经做的那样。但是,请确保在异常块的结尾处
中断
/
返回
,这样您就不会尝试下一个。通过在循环中使用
continue
,可以在中这样做

如果您想在异常块中做一些不同的事情,嵌套它们会有所帮助。但如果不是这样,你每次都会重复
,除了
块。如果您想做一些不同的事情,当您退出嵌套-
try
s时,您将无法确定它已完成或引发异常的级别-需要使用标志值等来仅跟踪该级别。因此,对于相同错误处理代码的示例,至少,在
块中执行类似操作,但
块除外:

except socket.error as e:
    socket_error_handler(e, s)

def socket_error_handler(exception, socket):
    #write error code to file
    etc.
我是否应该将
socket.socket
也放入try/catch块

他们在上面链接的示例中这样做

除了日志记录,您不应该在每个阶段都执行相同的异常处理。可能需要单独处理这些问题

第2部分:


s.settimeout(5.0)
为每个套接字操作设置超时,而不仅仅是第一次连接。也意味着它在。

因为您在所有异常块中执行完全相同的操作,并捕获相同的
套接字.error
异常,所以您可以将
s.connect
s.sendall
s.recv
放在同一
块中。像这样:

try:
    s.connect((TCP_IP, TCP_PORT))
    s.sendall(MESSAGE)
    data = s.recv(BUFFER_SIZE)
except socket.error:
    #write error code to file
finally:
    s.close()
请注意,由于示例中的
s.close
也位于
finally
部分,因此即使发生异常,也会始终调用它。因此,当您试图关闭一个已经关闭的套接字时,会出现另一个异常。通过不将其放在
块中,而只放在
最后
中,可以避免这种情况

如果您确实打算以不同的方式处理每个错误,那么您可以将它们分开,就像您已经做的那样。但是,请确保在异常块的结尾处
中断
/
返回
,这样您就不会尝试下一个。通过在循环中使用
continue
,可以在中这样做

如果您想在异常块中做一些不同的事情,嵌套它们会有所帮助。但如果不是这样,你每次都会重复
,除了
块。如果您想做一些不同的事情,当您退出嵌套-
try
s时,您将无法确定它已完成或引发异常的级别-需要使用标志值等来仅跟踪该级别。因此,对于相同错误处理代码的示例,至少,在
块中执行类似操作,但
块除外:

except socket.error as e:
    socket_error_handler(e, s)

def socket_error_handler(exception, socket):
    #write error code to file
    etc.
我是否应该将
socket.socket
也放入try/catch块

他们在上面链接的示例中这样做

除了日志记录,您不应该在每个阶段都执行相同的异常处理。可能需要单独处理这些问题

第2部分:


s.settimeout(5.0)
为每个套接字操作设置超时,而不仅仅是第一次连接。也意味着它在。

谢谢您的回答!还有一个问题,当我使用原始版本(一个接一个的try/catch块)并且在socket.connect()捕获异常时会发生什么。。我猜所有的套接字操作都被执行了,这是不好的?谢谢你的回答!还有一个问题,当我使用原始版本(一个接一个的try/catch块)并且在socket.connect()捕获异常时会发生什么。。我猜所有的套接字操作都被执行了,这不好吗?