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_Loops_Exception - Fatal编程技术网

Python套接字连接错误/异常处理?

Python套接字连接错误/异常处理?,python,sockets,loops,exception,Python,Sockets,Loops,Exception,因此,我有下面的循环,它工作得很好,直到它击中某些主机,只是导致连接错误。不幸的是,它没有跳过这些实例,而是导致脚本崩溃。我知道要捕获并避免此异常,最好在try:except块中通过令人不安的语句(serveroutput=tn.read\u until(b'STARTTLS'))。我可以做到这一点,但我不知道如何抓住错误并告诉它继续前进。如果我添加一个中断,它将中断循环并导致脚本提前停止。如何继续迭代j?我听说我可以使用“continue”作为继续迭代的一种方式,但我在这里捕捉到了正确的异常吗

因此,我有下面的循环,它工作得很好,直到它击中某些主机,只是导致连接错误。不幸的是,它没有跳过这些实例,而是导致脚本崩溃。我知道要捕获并避免此异常,最好在try:except块中通过令人不安的语句(serveroutput=tn.read\u until(b'STARTTLS'))。我可以做到这一点,但我不知道如何抓住错误并告诉它继续前进。如果我添加一个中断,它将中断循环并导致脚本提前停止。如何继续迭代j?我听说我可以使用“continue”作为继续迭代的一种方式,但我在这里捕捉到了正确的异常吗

我的代码:

def getServers():
    fp = open("mailserverdata.csv", "r")
    pt = from_csv(fp)
    fp.close()
    domains = txt_domains.get(1.0, 'end').splitlines()
    symbols = txt_symbols.get(1.0, 'end').splitlines()
    for x in range(len(domains)):
        #Start Get MX Record
        answers = dns.resolver.query(str(domains[x]), 'MX')
        #End Get MX Record
        #Start Get Employees
        if symbols[x]!='':
            xml = urllib.request.urlopen('https://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20yahoo.finance.stocks%20where%20symbol%3D%22'+symbols[x]+'%22&diagnostics=true&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys')
            dom = parse(xml)
            numemployees = dom.getElementsByTagName('FullTimeEmployees')
            if len(numemployees)!=0:
                numemployees = numemployees[0].firstChild.nodeValue
        else:
            numemployees = 0
        #End Get Employees
        j=0
        tlsbool = 'N'
        verified = 'N'
        for rdata in answers:
            #Start Trim Domains
            output = str(rdata.exchange)
            output = output[:len(output)-1]
            print(output)
            #End Trim Domains
            #Start Telnet
            tn = telnetlib.Telnet(output,25)
            tn.write(b'ehlo a.com\r\n')
            serveroutput = tn.read_until(b'STARTTLS')
            checkvar = "STARTTLS"
            for checkvar in serveroutput:
                tlsbool = 'Y'
                break
            #End Telnet
            #Start verification
            if output.find(domains[x])>-1:
                verified = 'Y'
            #End verification
            if j==0:
                pt.add_row([domains[x],output,tlsbool,numemployees,verified])
            else:
                pt.add_row(['',output,tlsbool,'',verified])
            j = j + 1
    txt_tableout.delete(1.0, 'end')
    txt_tableout.insert('end',pt)
    root.ptglobal = pt
try:
    serveroutput = tn.read_until(b'STARTTLS')
except SocketError as e:
    if e.errno != errno.ECONNRESET:
        raise # Not error we are looking for
    pass # Handle error here.
Traceback (most recent call last):
  File "C:\Python34\lib\tkinter\__init__.py", line 1487, in __call__
    return self.func(*args)
  File "C:\Users\kylec\Desktop\Data Motion\Mail Server Finder\mailserverfinder.py", line 58, in getServers
    serveroutput = tn.read_until(b'STARTTLS')
  File "C:\Python34\lib\telnetlib.py", line 317, in read_until
    self.fill_rawq()
  File "C:\Python34\lib\telnetlib.py", line 526, in fill_rawq
    buf = self.sock.recv(50)
ConnectionResetError: [WinError 10054] An existing connection was forcibly closed by the remote host
尝试捕获代码:

def getServers():
    fp = open("mailserverdata.csv", "r")
    pt = from_csv(fp)
    fp.close()
    domains = txt_domains.get(1.0, 'end').splitlines()
    symbols = txt_symbols.get(1.0, 'end').splitlines()
    for x in range(len(domains)):
        #Start Get MX Record
        answers = dns.resolver.query(str(domains[x]), 'MX')
        #End Get MX Record
        #Start Get Employees
        if symbols[x]!='':
            xml = urllib.request.urlopen('https://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20yahoo.finance.stocks%20where%20symbol%3D%22'+symbols[x]+'%22&diagnostics=true&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys')
            dom = parse(xml)
            numemployees = dom.getElementsByTagName('FullTimeEmployees')
            if len(numemployees)!=0:
                numemployees = numemployees[0].firstChild.nodeValue
        else:
            numemployees = 0
        #End Get Employees
        j=0
        tlsbool = 'N'
        verified = 'N'
        for rdata in answers:
            #Start Trim Domains
            output = str(rdata.exchange)
            output = output[:len(output)-1]
            print(output)
            #End Trim Domains
            #Start Telnet
            tn = telnetlib.Telnet(output,25)
            tn.write(b'ehlo a.com\r\n')
            serveroutput = tn.read_until(b'STARTTLS')
            checkvar = "STARTTLS"
            for checkvar in serveroutput:
                tlsbool = 'Y'
                break
            #End Telnet
            #Start verification
            if output.find(domains[x])>-1:
                verified = 'Y'
            #End verification
            if j==0:
                pt.add_row([domains[x],output,tlsbool,numemployees,verified])
            else:
                pt.add_row(['',output,tlsbool,'',verified])
            j = j + 1
    txt_tableout.delete(1.0, 'end')
    txt_tableout.insert('end',pt)
    root.ptglobal = pt
try:
    serveroutput = tn.read_until(b'STARTTLS')
except SocketError as e:
    if e.errno != errno.ECONNRESET:
        raise # Not error we are looking for
    pass # Handle error here.
Traceback (most recent call last):
  File "C:\Python34\lib\tkinter\__init__.py", line 1487, in __call__
    return self.func(*args)
  File "C:\Users\kylec\Desktop\Data Motion\Mail Server Finder\mailserverfinder.py", line 58, in getServers
    serveroutput = tn.read_until(b'STARTTLS')
  File "C:\Python34\lib\telnetlib.py", line 317, in read_until
    self.fill_rawq()
  File "C:\Python34\lib\telnetlib.py", line 526, in fill_rawq
    buf = self.sock.recv(50)
ConnectionResetError: [WinError 10054] An existing connection was forcibly closed by the remote host
完整堆栈错误:

def getServers():
    fp = open("mailserverdata.csv", "r")
    pt = from_csv(fp)
    fp.close()
    domains = txt_domains.get(1.0, 'end').splitlines()
    symbols = txt_symbols.get(1.0, 'end').splitlines()
    for x in range(len(domains)):
        #Start Get MX Record
        answers = dns.resolver.query(str(domains[x]), 'MX')
        #End Get MX Record
        #Start Get Employees
        if symbols[x]!='':
            xml = urllib.request.urlopen('https://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20yahoo.finance.stocks%20where%20symbol%3D%22'+symbols[x]+'%22&diagnostics=true&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys')
            dom = parse(xml)
            numemployees = dom.getElementsByTagName('FullTimeEmployees')
            if len(numemployees)!=0:
                numemployees = numemployees[0].firstChild.nodeValue
        else:
            numemployees = 0
        #End Get Employees
        j=0
        tlsbool = 'N'
        verified = 'N'
        for rdata in answers:
            #Start Trim Domains
            output = str(rdata.exchange)
            output = output[:len(output)-1]
            print(output)
            #End Trim Domains
            #Start Telnet
            tn = telnetlib.Telnet(output,25)
            tn.write(b'ehlo a.com\r\n')
            serveroutput = tn.read_until(b'STARTTLS')
            checkvar = "STARTTLS"
            for checkvar in serveroutput:
                tlsbool = 'Y'
                break
            #End Telnet
            #Start verification
            if output.find(domains[x])>-1:
                verified = 'Y'
            #End verification
            if j==0:
                pt.add_row([domains[x],output,tlsbool,numemployees,verified])
            else:
                pt.add_row(['',output,tlsbool,'',verified])
            j = j + 1
    txt_tableout.delete(1.0, 'end')
    txt_tableout.insert('end',pt)
    root.ptglobal = pt
try:
    serveroutput = tn.read_until(b'STARTTLS')
except SocketError as e:
    if e.errno != errno.ECONNRESET:
        raise # Not error we are looking for
    pass # Handle error here.
Traceback (most recent call last):
  File "C:\Python34\lib\tkinter\__init__.py", line 1487, in __call__
    return self.func(*args)
  File "C:\Users\kylec\Desktop\Data Motion\Mail Server Finder\mailserverfinder.py", line 58, in getServers
    serveroutput = tn.read_until(b'STARTTLS')
  File "C:\Python34\lib\telnetlib.py", line 317, in read_until
    self.fill_rawq()
  File "C:\Python34\lib\telnetlib.py", line 526, in fill_rawq
    buf = self.sock.recv(50)
ConnectionResetError: [WinError 10054] An existing connection was forcibly closed by the remote host
更新:

def getServers():
    fp = open("mailserverdata.csv", "r")
    pt = from_csv(fp)
    fp.close()
    domains = txt_domains.get(1.0, 'end').splitlines()
    symbols = txt_symbols.get(1.0, 'end').splitlines()
    for x in range(len(domains)):
        #Start Get MX Record
        answers = dns.resolver.query(str(domains[x]), 'MX')
        #End Get MX Record
        #Start Get Employees
        if symbols[x]!='':
            xml = urllib.request.urlopen('https://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20yahoo.finance.stocks%20where%20symbol%3D%22'+symbols[x]+'%22&diagnostics=true&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys')
            dom = parse(xml)
            numemployees = dom.getElementsByTagName('FullTimeEmployees')
            if len(numemployees)!=0:
                numemployees = numemployees[0].firstChild.nodeValue
        else:
            numemployees = 0
        #End Get Employees
        j=0
        tlsbool = 'N'
        verified = 'N'
        for rdata in answers:
            #Start Trim Domains
            output = str(rdata.exchange)
            output = output[:len(output)-1]
            print(output)
            #End Trim Domains
            #Start Telnet
            tn = telnetlib.Telnet(output,25)
            tn.write(b'ehlo a.com\r\n')
            serveroutput = tn.read_until(b'STARTTLS')
            checkvar = "STARTTLS"
            for checkvar in serveroutput:
                tlsbool = 'Y'
                break
            #End Telnet
            #Start verification
            if output.find(domains[x])>-1:
                verified = 'Y'
            #End verification
            if j==0:
                pt.add_row([domains[x],output,tlsbool,numemployees,verified])
            else:
                pt.add_row(['',output,tlsbool,'',verified])
            j = j + 1
    txt_tableout.delete(1.0, 'end')
    txt_tableout.insert('end',pt)
    root.ptglobal = pt
try:
    serveroutput = tn.read_until(b'STARTTLS')
except SocketError as e:
    if e.errno != errno.ECONNRESET:
        raise # Not error we are looking for
    pass # Handle error here.
Traceback (most recent call last):
  File "C:\Python34\lib\tkinter\__init__.py", line 1487, in __call__
    return self.func(*args)
  File "C:\Users\kylec\Desktop\Data Motion\Mail Server Finder\mailserverfinder.py", line 58, in getServers
    serveroutput = tn.read_until(b'STARTTLS')
  File "C:\Python34\lib\telnetlib.py", line 317, in read_until
    self.fill_rawq()
  File "C:\Python34\lib\telnetlib.py", line 526, in fill_rawq
    buf = self.sock.recv(50)
ConnectionResetError: [WinError 10054] An existing connection was forcibly closed by the remote host
我尝试了以下代码,但收到了以下错误

代码: 尝试: serveroutput=tn.read\u直到(b'STARTTLS') 除tn.ConnectionsResetError外: 继续

错误:

AttributeError: 'Telnet' object has no attribute 'ConnectionsResetError'

最终对我有效的是对@user3570335建议的修改

try:
    serveroutput = tn.read_until(b'STARTTLS')
except Exception as e:
    tlsbool = '?'

正在捕获SocketError,为ConnectionResetError添加catch语句--好的,请参阅更新的代码,我尝试了ConnectionResetError,但这是telnet或socket的一部分吗?@user3570335,我想我需要一个winerror,但是当尝试捕获winerror时,我得到:TypeError:捕获不从BaseException继承的类是不允许的尝试除了socket.error,e:打印“Ohhh socket error”哦好的,它不起作用,但使用泛型的是,所以异常就像e似乎起作用一样。