Python子域名查找脚本错误处理函数行为不一致求助
排查子域名查找工具错误处理函数异常的思路
1. 参数不足场景:未触发错误提示
- 问题根源:脚本开头未主动校验
sys.argv长度,或校验逻辑未关联throw_error。直接取sys.argv[1]/sys.argv[2]会触发IndexError,但如果没捕获该异常并传给throw_error,就不会输出自定义提示。 - 解决:在脚本最开头添加参数校验逻辑,主动调用
throw_error:import sys def throw_error(msg): print(f"[ERROR] {msg}", file=sys.stderr) if len(sys.argv) != 3: throw_error("使用错误:请输入正确格式\n示例:python subdomain.py 子域名列表.txt https://example.com") sys.exit(1)
2. 子域名列表文件不存在场景:无错误输出
- 问题根源:打开文件时未捕获
FileNotFoundError,或捕获后未调用throw_error。若直接执行open()操作,文件不存在会触发系统异常,但如果你的异常捕获仅覆盖连接错误,就不会触发自定义提示。 - 解决:在文件读取代码块外添加异常捕获:
try: with open(sys.argv[1], 'r') as f: subdomains = f.read().splitlines() except FileNotFoundError: throw_error(f"错误:子域名列表文件 {sys.argv[1]} 不存在") sys.exit(1)
3. URL缺少http(s)前缀场景:无格式提示
- 问题根源:未主动校验URL格式,或未捕获
requests库抛出的InvalidURL异常。直接发起请求会触发异常,但如果捕获逻辑未包含该类型,throw_error就不会被调用。 - 解决:二选一即可:
- 主动校验URL前缀:
target_url = sys.argv[2] if not target_url.startswith(('http://', 'https://')): throw_error("错误:URL必须包含http://或https://前缀") sys.exit(1) - 捕获
InvalidURL异常:import requests try: response = requests.get(f"{target_url}/{subdomain}", timeout=3) except requests.exceptions.InvalidURL: throw_error(f"错误:URL格式不正确,请检查前缀") except requests.exceptions.ConnectionError: throw_error(f"子域名 {subdomain} 不存在或无法连接")
- 主动校验URL前缀:
4. 连接错误正常工作的原因
你已经在子域名请求的代码块中捕获了ConnectionError并调用throw_error,所以该场景能正常触发。而前三个场景要么缺少主动校验,要么未覆盖对应异常类型,导致throw_error未被执行。
额外检查点
- 确认
throw_error函数实现无问题,比如是否正确接收参数并输出到标准错误流:def throw_error(msg): print(f"[ERROR] {msg}", file=sys.stderr) - 检查所有可能抛出异常的代码块,确保都被
try-except包裹,并在except块中正确调用throw_error,不要遗漏异常类型。
内容的提问来源于stack exchange,提问作者Mohamad
相关产品推荐
相关产品推荐

