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'関数を呼び出すと、コマンドラインでパラメーターを渡さなかった場合、期待どおりに「ERROR」出力とsysexitが表示されます。

ただし、コマンドラインでパラメーター(「-mycommand」など)を指定すると、「SPECIFIC_TEXT」が出力され、EXCEPTブロックからも「ERROR」メッセージが出力されます。

TRYブロックは、パラメーターを指定した場合にのみ実行されます。指定しない場合、EXCEPTが順番を取得します。ただし、TRYブロックとEXCEPTブロックを一緒に実行しています。

誰かがこの行動の理由を知っていますか?私のコードに間違いはありますか?すべてのTks!

4

4 に答える 4

5

私はあなたの質問を理解していると思います...

sys.exit()あなたのexceptステートメントがキャッチしているSystemExit例外を発生させて終了します。

于 2012-06-22T03:38:21.553 に答える
4

ここにある回答: http://docs.python.org/library/sys.html

sys.exit([引数])

Python を終了します。これは SystemExit 例外を発生させることによって実装されるため、try ステートメントの finally 句で指定されたクリーンアップ アクションが受け入れられ、外部レベルで終了試行をインターセプトすることが可能です。

sys.exit例外を発生させることによって機能します。そのため、except ブロックが実行されます。

于 2012-06-22T03:39:09.820 に答える
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

于 2012-06-22T20:52:43.243 に答える
1

制御フローロジックを使用して状態を確認できる状況では、try/を使用しないでください。except

代わりに、この場合、かどうかを確認してくださいlen(sys.argv) > 1

特に空白を使用しないもう1つの理由:またはのexceptようなシステム例外さえもキャッチし、厄介なキルがない限りプログラムを終了することが不可能になる可能性があります。SystemExitKeyboardInterrupt

于 2012-06-22T03:43:28.833 に答える