2011-04-13 10 views
5

Có cách nào để biết khóa nào có liên quan khi cuộc gọi như sau không thành công?Xử lý tốt hơn khóa bị thiếu/sai trong tăng cường :: program_options

boost::program_options::variables_map vm; 
... 
int foo_bar = vm["some_key"].as<int>(); 

Nếu khóa là mất tích từ bản đồ, hoặc không chuyển đổi sang int, tôi nhận được một bad_any_cast thay vì không đủ thông tin, và tôi không thể biết bất cứ điều nào sau đây:

  • chìa khóa có liên quan
  • giá trị được lưu trữ hoặc thậm chí nếu nó ở đó.
  • các loại tham gia

tôi không thể tìm thấy của bất kỳ giải pháp mà không liên quan đến một trong hai thay đổi tiêu đề tăng hoặc gói mỗi cuộc gọi đến trên trong một khối try..catch. Tôi nghĩ rằng đó là một vấn đề phổ biến, vì vậy có thể ai đó biết cách tiếp cận tốt hơn.

+3

Tôi tin rằng các mẫu được cung cấp trong tài liệu thường kiểm tra mọi tùy chọn bằng cách sử dụng 'if (vm.count (" some_key ")! = 0)', do đó, có vẻ như đây là cách chúng dự định sử dụng. –

+0

Phải kiểm tra mọi chìa khóa đơn giản là lý tưởng, tôi đã hy vọng trong một giải pháp tiết kiệm hơn. Tôi nhận thấy rằng trong các phiên bản gần đây, người dùng có thể đặt tùy chọn là "bắt buộc", do đó tăng ngoại lệ nếu khóa bị thiếu. Tất nhiên điều này sẽ không hoạt động đối với các giá trị tùy chọn và tôi vẫn gặp sự cố khi xử lý các giá trị không hợp lệ –

Trả lời

3

Marco,

không có cách nào để có chẩn đoán tốt hơn mà không sửa đổi thư viện. Tuy nhiên, xin lưu ý rằng nói chung, tôi không chắc chắn ngoại lệ trong trường hợp này được cho là rất chi tiết: - Nếu bạn sử dụng loại sai để truy cập biến, bạn đã gặp phải lỗi mã hóa. Bạn có thể dễ dàng theo dõi điều đó bằng trình gỡ lỗi - Nếu bạn truy cập một biến không tồn tại, bạn cần phải nếu vm.count hoặc sử dụng giá trị mặc định. Một lần nữa, nó có thể là một lỗi mã hóa tốt nhất được giải quyết bằng cách sử dụng một trình gỡ rối.

Tôi đồng ý rằng bad_any_cast là thứ có thể được cải thiện, nhưng dường như ngoại lệ đó có thể được báo cáo cho người dùng phải là mục tiêu ở đây, trong trường hợp ngoại lệ là do lỗi mã hóa.

+0

Cảm ơn bạn đã trả lời. Trên thực tế tôi đã được ấn tượng rằng có người sử dụng bằng cách sử dụng một giá trị sai cho một tùy chọn sẽ ném ngoại lệ bad_any_cast, nhưng nó không phải là trường hợp. Vì vậy, có, trong vấn đề đó nó phải là một lỗi mã hóa. Tuy nhiên, tôi nghĩ rằng một giá trị còn thiếu có thể được xử lý tốt hơn. –