[英]Try-Except Behavior
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!
我想我理解你的问题......
sys.exit()
通过引发您的except语句捕获的SystemExit异常退出。
答案在这里找到: http : //docs.python.org/library/sys.html
sys.exit([参数])
退出Python。 这是通过引发SystemExit异常来实现的 ,因此可以遵循try语句的finally子句指定的清除操作,并且可以拦截外层的退出尝试。
sys.exit
通过引发异常来工作。 这就是你的except块执行的原因。
你真的不应该使用try
/ except
,你可以使用控制流逻辑来检查状态。
相反,在这种情况下,检查len(sys.argv) > 1
。
except
永远不会特别使用空白的另一个原因:您将捕获甚至系统异常,如SystemExit
或KeyboardInterrupt
,这使得它可能无法终止您的程序而不是凌乱的杀戮。
我知道你已经接受了答案,但我认为问题的根源在于你的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
更严格地遵循这一指导方针except
,对于裸露的大多数警告都没有实际意义。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.