Python使用try捕获sys.argv的IndexError仍报错问题求助
问题根源
你的异常捕获逻辑没有覆盖到触发报错的代码。Python是按从上到下的顺序执行代码的,你在所有try代码块之前,就提前写了两行无任何异常保护的sys.argv取值操作:
t = sys.argv[1] u = sys.argv[2]
只要启动脚本时没有传入足够的命令行参数,这两行会最先触发IndexError,程序直接崩溃终止,根本走不到后面你写的try块逻辑,自然也不会触发你预设的异常处理分支。你看到的报错栈,本质就是程序还没执行到你写的异常捕获代码,就已经崩了。
修正方案
删掉try块外重复的无保护取值代码,把所有可能触发索引越界的sys.argv取值操作,全部放到对应的try块内部即可:
#!/usr/bin/python3 import sys t = None u = None try: t = sys.argv[1] except IndexError: print("no arg 1") try: u = sys.argv[2] except IndexError: print("no arg 2") # 后续逻辑可以通过判断t、u是否为None,确认参数是否正常传入
拓展写法
除了用异常捕获处理缺参场景,也可以提前判断sys.argv的长度做校验,逻辑更直观:
#!/usr/bin/python3 import sys # sys.argv[0]是脚本自身的路径,从下标1开始才是传入的参数 arg_count = len(sys.argv) - 1 t = sys.argv[1] if arg_count >= 1 else None u = sys.argv[2] if arg_count >= 2 else None if t is None: print("no arg 1") if u is None: print("no arg 2")
不需要为不同参数需求拆分独立脚本,在同一个脚本里通过参数判断走不同逻辑分支即可,维护成本低很多。
内容的提问来源于stack exchange,提问作者SickAndTired
相关产品推荐
相关产品推荐

