Logging Boost :: исключение, избегая файла / линии / функции и нытье - PullRequest
1 голос
/ 23 сентября 2011

В моей собственной библиотеке журналов я пытаюсь изменить пользовательский класс исключений, чтобы он производился от boost :: exception вместо std :: exception.Я делаю это так, чтобы я мог использовать один блок catch как для исключений наддува, так и для приложений.Но я сталкиваюсь с проблемой при ее регистрации.

При регистрации исключения с помощью boost :: диагностика_информация () я получаю целых 9 ярдов о месте выброса.Эта информация для меня избыточна, так как мой пользовательский класс уже собирает и использует эту информацию так, как я хочу.Я не хочу печатать файл с исходным кодом / информацию о строке / функции в журнале.

Если я определяю BOOST_EXCEPTION_DISABLE или не использую BOOST_THROW_EXCEPTION, он печатает " Бросок неизвестен (рассмотрите возможность использования BOOST_THROW_EXCEPTION) "каждый раз, когда я регистрирую исключение.

Но как мне избежать этого нытья?

Ответы [ 2 ]

4 голосов
/ 23 сентября 2011

Хорошо, я думаю, что нашел ответ сам.Прежде всего, мне не нужно выводить мой класс из boost :: exception, я все еще могу продолжать наследовать от std :: exception.Однако я должен выбросить мой производный класс std :: exception используя BOOST_THROW_EXCEPTION.Таким образом, это становится boost :: исключением, поскольку это взлетает.: -)

В промежутке я могу добавить дополнительную информацию, если требуется, путем перехвата и перебрасывания.

  typedef boost::error_info<struct tag_errmsg, std::string> exceptionInfo; 

  catch (boost::exception &e) 
  { 
    e << exceptionInfo("some more exception data"); 
    throw; 
  } 

И тогда я наконец могу поймать и напечатать это следующим образом:

catch (boost::exception &e) 
{ 
    std::exception const * se = dynamic_cast<std::exception const *>(&e);
    if(se)
    {
        // will enter here only for my application exception and not for pure boost exception
        std::cout << "STD: " << se->what();
    }
    std::cout << " BOOST: " << *boost::get_error_info<exceptionInfo>(e);        }
} 

Таким образом, я получу как строку what () из std :: exception, так и сообщение об ошибке из boost :: exception.Я на правильном пути?

0 голосов
/ 23 сентября 2011

Разве вы не хотите использовать исключение :: что () вместо boost :: диагностика_информация ()?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...