2012-03-27 5 views
8

自分のカスタムアクションからArgumentTypeError例外をスローし、argparseがそれを捕まえるようにするベストプラクティスは何ですか?カスタムアクションからArgumentTypeError例外をキャッチ

argparseのtry/exceptブロックがカスタムアクションのこの例外を処理しないようです。その組み込みアクションではうまくいきますが、

class unique_server_endpoints(argparse.Action): 
    """This class avoids having two duplicate OuterIPs in the client argument list""" 
    def __call__(self, parser, namespace, values, option_string=None): 
     ips = set() 
     endpoints = [] 
     for r in values: 
      ep = server_endpoint(r) 
      if ep[0] in ips: 
       raise argparse.ArgumentTypeError("Duplicate OuterIPs found") 
      else: 
       ips.add(ep[0]) 
       endpoints.append(ep) 
     setattr(namespace, self.dest, endpoints) 

と例えば

group.add_argument('-c', "--client", nargs = 2, 
      dest = "servers", action = unique_server_endpoints, 

、私は重複したIPアドレスを持っている希望の場合、上記のコードでは、例外がダウン メイン機能に落ち、醜いスタックトレースを出力します。私はそれを望んでいないし、どちらもtry/exceptブロックを内部に入れたくない。 メイン

答えて

9

argparseのソースコードを見て、私はArgumentTypeErrorをArgumentError例外に変換すると考えました。

ので、代わりの:

  raise argparse.ArgumentTypeError("Duplicate OuterIPs found") 

私が持っている必要があります。

  raise argparse.ArgumentError(self, "Duplicate OuterIPs found") 

そしてargparseはまだ(キャッチ例外と印刷使用方法のメッセージ)私のための残りを行います...

+1

申し訳ありません私はちょうど "ありがとう"コメントを書いてはいけません。しかし、このニッチな質問は、私が持っていたものと全く同じでした。そして、OPの答えがそれを釘付けにしました! :-) – halloleo