Python 试除行为
大家好…我对上面的代码有问题。当我调用“checkarg”函数时,如果我没有在命令行上传递任何参数,我将得到“ERROR”输出和sys exit,正如预期的那样。Python 试除行为,python,Python,大家好…我对上面的代码有问题。当我调用“checkarg”函数时,如果我没有在命令行上传递任何参数,我将得到“ERROR”输出和sys exit,正如预期的那样。 但是,如果我在命令行上提供一个参数(如“-mycommand”),它会打印“特定的_文本”,然后也会从EXCEPT块打印“错误”消息。 TRY块仅在我提供参数时运行,如果我不提供参数,则EXCEPT将获得该回合。但是,它同时运行TRY和EXCEPT块 有人知道这种行为的原因吗??我的密码有错吗?谢谢大家 我想我理解你的问题 sys.e
但是,如果我在命令行上提供一个参数(如“-mycommand”),它会打印“特定的_文本”,然后也会从EXCEPT块打印“错误”消息。
TRY块仅在我提供参数时运行,如果我不提供参数,则EXCEPT将获得该回合。但是,它同时运行TRY和EXCEPT块
有人知道这种行为的原因吗??我的密码有错吗?谢谢大家 我想我理解你的问题
sys.exit()
系统退出([arg])
退出Python这是通过引发SystemExit异常来实现的,因此try语句的finally子句指定的清理操作得到遵守,并且可以在外部级别拦截退出尝试
sys.exit
通过引发异常来工作。这就是执行except块的原因。对于可以使用控制流逻辑检查状态的情况,确实不应该使用try
/except
相反,在这种情况下,检查是否len(sys.argv)>1
不要特别使用空白的另一个原因是除了
:你甚至会捕捉到系统异常,如SystemExit
或键盘中断
,这使得你的程序可能无法在一次混乱的杀戮中终止。我知道你已经接受了答案,但我认为问题的根源在于try
块包含的代码不一定希望捕获异常;相反,如果没有异常发生,您只希望在希望捕获异常的代码之后执行这些语句
为了解决这个问题,您的try
块应该只包含filename=str(sys.argv[1])
,现在在try
块中的其余代码应该移动到else
块,只有在没有异常发生时才会执行。换言之:
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()
或者在这种情况下,由于在出现异常时完全退出脚本,因此实际上不需要else
:
try:
filename=str(sys.argv[1])
except:
print "ERROR"
sys.exit()
else:
if filename=="-mycommand":
print "SPECIFIC_TEXT"
sys.exit()
else:
return filename
事实上,除了
之外,你用裸露的捕捉每一个异常都是不好的风格,改变它也可以避免问题,但对我来说,这是次要的。您不希望在if/else
代码中捕获异常,因此它不应该首先出现在try
块中。我想,如果更严格地遵循这一指导原则,那么除了
之外,大多数针对裸的警告都是没有意义的。也许问题在于所有的星号?为他修正了格式。另外,为什么str(sys.argv[1])
?sys.argv[1]不是已经是字符串了吗?很抱歉,谢谢您的修复!DSM,我没有检查,但可能是的。我这样做只是为了强制执行这一步,避免另一个错误。因此,它运行TRY块,当面对sys.exit()时,它会更改为EXCEPT块,因为SystemExit异常。因此,在实践中,它运行两个块。是的,谢谢你的推荐。我换了衣服,只是为了买我需要的东西。又来了@铂金
try:
filename=str(sys.argv[1])
except:
print "ERROR"
sys.exit()
if filename=="-mycommand":
print "SPECIFIC_TEXT"
sys.exit()
else:
return filename