Python函数中用try/except收集无DNS记录IP遇NameError问题
解决你的DNS查询函数NameError问题
嘿,我来帮你搞定这个问题~你遇到的NameError本质上是因为在触发socket.herror的分支里,你尝试操作的missing变量还没被定义,这确实是新手用try/except时容易踩的小坑。
问题根源
你大概率是在except块里才想着去创建missing列表,或者压根没在函数的全局(相对于循环)范围内初始化它。比如错误的写法可能是这样:
import socket def check_dns_records(ip_list): for ip in ip_list: try: host_info = socket.gethostbyaddr(ip) print(f"{ip} -> {host_info[0]}") except socket.herror: # 这里missing还没定义,一执行就会报错 missing.append(ip) return missing
当代码走到except分支时,Python发现missing这个名字从来没被创建过,自然就抛出NameError了。
正确的写法
核心就是提前初始化存放无DNS记录IP的列表,确保不管有没有触发异常,这个变量都存在。看下面的示例:
import socket def check_dns_records(ip_list): # 先初始化空列表,这一步是关键! missing_dns_ips = [] for ip in ip_list: try: # 反向DNS查询,获取主机名 hostname, _, _ = socket.gethostbyaddr(ip) print(f"IP {ip} 解析到主机名: {hostname}") except socket.herror: # 捕获到解析错误,把IP加入列表 missing_dns_ips.append(ip) # 循环结束后返回结果列表 return missing_dns_ips # 测试用例 test_ips = ["8.8.8.8", "192.168.0.250", "1.1.1.1"] result = check_dns_records(test_ips) print("\n无DNS记录的IP列表:", result)
关键知识点
- 变量必须先定义再使用:在函数开头就初始化空列表,保证
except块和最后的return都能访问到它 - 特定异常捕获:你用
socket.herror是对的,它专门对应主机名解析失败的错误,比捕获通用的Exception更精准 - 列表的append操作:每次捕获到错误时,把当前IP追加到列表里,最后统一返回,而不是在分支里单独返回(那样会中断循环)
内容的提问来源于stack exchange,提问作者Krilion
相关产品推荐
相关产品推荐

