尝试 - 除外行为

时间:2012-06-22 03:31:44

标签: python

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!

4 个答案:

答案 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的另一个原因:你甚至会捕获SystemExitKeyboardInterrupt等系统异常,这使得你可能无法终止你的程序而不是凌乱的杀戮。

答案 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的警告都没有实际意义。