Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 试除行为_Python - Fatal编程技术网

Python 试除行为

Python 试除行为,python,Python,大家好…我对上面的代码有问题。当我调用“checkarg”函数时,如果我没有在命令行上传递任何参数,我将得到“ERROR”输出和sys exit,正如预期的那样。 但是,如果我在命令行上提供一个参数(如“-mycommand”),它会打印“特定的_文本”,然后也会从EXCEPT块打印“错误”消息。 TRY块仅在我提供参数时运行,如果我不提供参数,则EXCEPT将获得该回合。但是,它同时运行TRY和EXCEPT块 有人知道这种行为的原因吗??我的密码有错吗?谢谢大家 我想我理解你的问题 sys.e

大家好…我对上面的代码有问题。当我调用“checkarg”函数时,如果我没有在命令行上传递任何参数,我将得到“ERROR”输出和sys exit,正如预期的那样。

但是,如果我在命令行上提供一个参数(如“-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