You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 07:19:28