import sys
def checkarg():
try:
filename=str(sys.argv[1])
if filename=="-mycommand":
print "SPECIFIC_TEXT"
sys.exit()
else:
return filename
except:
print "ERROR"
sys.exit()
大家好......我的上述代码有问题。当我调用'checkarg'函数时,如果我没有在命令行上传递任何参数,我有“ERROR”输出和sys退出,正如预期的那样。
但是,如果我在命令行上提供一个参数(如“-mycommand”),它会打印“SPECIFIC_TEXT”,然后从EXCEPT块打印“ERROR”消息。
TRY块仅在我提供参数时运行,如果不提供,则EXCEPT将转弯。但是,它正在运行TRY和EXCEPT块。
有人知道这种行为的原因吗?我的代码有什么错误吗? Tks for all!
答案 0 :(得分:5)
我想我理解你的问题......
sys.exit()
通过引发您的except语句捕获的SystemExit异常退出。
答案 1 :(得分:4)
在此处找到答案:http://docs.python.org/library/sys.html
sys.exit([arg])
退出Python。 这是通过引发SystemExit异常来实现的,因此可以接受try语句的finally子句指定的清除操作,并且可以拦截外层的退出尝试。
sys.exit
通过提出异常来工作。这就是你的except块执行的原因。
答案 2 :(得分:1)
在您可以使用控制流逻辑检查状态的情况下,您真的不应该使用try
/ except
。
相反,在这种情况下,请检查是否len(sys.argv) > 1
。
永远不会特别使用空白except
的另一个原因:你甚至会捕获SystemExit
或KeyboardInterrupt
等系统异常,这使得你可能无法终止你的程序而不是凌乱的杀戮。
答案 3 :(得分:1)
我知道您已经接受了答案,但我认为问题的根源在于您的try
块包含您不一定希望捕获异常的代码;相反,你只希望在代码之后执行这些语句,如果没有异常发生,你希望捕获异常。
要解决此问题,您的try
数据块应仅包含filename=str(sys.argv[1])
,而try
数据块中现在的其余代码应移至else
数据块,只有在没有异常发生时才会执行。换句话说:
try:
filename=str(sys.argv[1])
except:
print "ERROR"
sys.exit()
else:
if filename=="-mycommand":
print "SPECIFIC_TEXT"
sys.exit()
else:
return filename
或者在这种情况下,由于您在异常情况下完全退出脚本,因此实际上并不需要else
:
try:
filename=str(sys.argv[1])
except:
print "ERROR"
sys.exit()
if filename=="-mycommand":
print "SPECIFIC_TEXT"
sys.exit()
else:
return filename
你用裸except
捕捉每一个异常的事实都是糟糕的风格,改变也可以避免这个问题,但对我来说,它是次要的。您不希望在if/else
代码中捕获异常,因此它不应该位于try
块中。恕我直言,如果更严格地遵循这一指导方针,那么大多数对裸except
的警告都没有实际意义。