2012-03-27 26 views
8

Thực tiễn tốt nhất để ném ngoại lệ ArgumentTypeError từ hành động tùy chỉnh của riêng tôi là gì và để argparse bắt nó cho tôi?Bắt ngoại lệ ArgumentTypeError từ hành động tùy chỉnh

Dường như khối thử/chặn của argparse không xử lý ngoại lệ này cho các hành động tùy chỉnh của tôi. Mặc dù nó chỉ là tốt cho hành động dựng sẵn của nó.

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, 

Ví dụ, trong đoạn code trên Nếu tôi sẽ có IP trùng lặp thì ngoại lệ sẽ rơi xuống chính chức năng và in stacktrace xấu xí. Tôi không muốn điều đó và tôi cũng không muốn đặt một khối thử/ngoại trừ bên trong chính.

Trả lời

9

Sau khi xem mã nguồn argparse, tôi đã tìm ra rằng nó dịch ArgumentTypeError thành ngoại lệ ArgumentError.

Vì vậy, thay vì:

  raise argparse.ArgumentTypeError("Duplicate OuterIPs found") 

tôi nên có:

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

Và argparse vẫn sẽ làm phần còn lại cho tôi (bắt ngoại lệ và in thông điệp sử dụng) ...

+1

Xin lỗi , Tôi nên * không * viết chỉ là một bình luận "Cảm ơn", tôi biết. Nhưng câu hỏi thích hợp này là * chính xác * câu hỏi tôi có - và câu trả lời của OP là nó! :-) – halloleo

Các vấn đề liên quan