2
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”函数时,如果我没有在命令行上传递任何参数,我就会得到“错误”输出和系统退出,正如预期的那样。

但是,如果我在命令行上提供一个参数(如“-mycommand”),它会打印“SPECIFIC_TEXT”,然后也会从 EXCEPT 块打印“ERROR”消息。

TRY 块只会在我提供参数时运行,如果我不提供,则 EXCEPT 将获得轮到。但是,它同时运行 TRY 和 EXCEPT 块。

有谁知道这种行为的原因?我的代码有什么错误吗?谢谢大家!

4

4 回答 4

5

我想我明白你的问题...

sys.exit()通过引发 SystemExit 异常退出,您的 except 语句正在捕获该异常。

于 2012-06-22T03:38:21.553 回答
4

在这里找到答案:http: //docs.python.org/library/sys.html

sys.exit([arg])

退出 Python。这是通过引发 SystemExit 异常来实现的,因此由 try 语句的 finally 子句指定的清理操作得到遵守,并且可以在外部级别拦截退出尝试。

sys.exit通过引发异常来工作。这就是你的 except 块执行的原因。

于 2012-06-22T03:39:09.820 回答
1

在可以使用控制流逻辑检查状态的情况下,您真的不应该使用try/ except

相反,在这种情况下,检查 if len(sys.argv) > 1

永远不要专门使用空白的另一个原因:您甚至会捕获诸如or之类的except系统异常,这使得您可能无法在没有凌乱杀死的情况下终止您的程序。SystemExitKeyboardInterrupt

于 2012-06-22T03:43:28.833 回答
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  

The fact that you're catching every exception with your bare except is bad style and changing that would also avoid the problem, but to me, it's secondary. You do not wish to catch exceptions in your if/else code, so it should not be in the try block to begin with. IMHO, most admonitions against bare except would be moot if this guideline were followed more closely.

于 2012-06-22T20:52:43.243 回答