2012-03-27 28 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仍然會完成剩下的,我(catch異常和打印用法消息)......

+1

對不起,我知道,我不應該只寫一個「謝謝」的評論。但是,這個小衆問題恰恰是*我所擁有的 - 而OP的答案就是它! :-) – halloleo 2014-05-08 06:07:21

相關問題