Обработка ошибок с помощью основных рекомендаций GSL ожидает, гарантирует и узкую_кастику
Я пытаюсь следовать руководящим принципам Cpp Core и использовать GSL там, где это необходимо. В частности, я хотел бы использоватьExpects
а также Ensures
для предварительных и пост-условий, а также span
, а также narrow_cast
, но обработка ошибок не является надежной и не обеспечивает диагностики. При обнаружении ошибок GSL просто вызываетterminate
оставляя тестировщика без подсказок относительно причины прерывания.
Итак, мой вопрос: как использовать GSL и обеспечить устойчивость кода при наличии ошибок? Или, проще говоря, как использовать GSL и получить диагностику ошибок до завершения?
1 ответ
Я не вижу простого способа добиться этого. Вы можете написать свой собственный обработчик завершения, который будет вызыватьсяstd::terminate
, но здесь нет контекста, где и почему std::terminate
назывался. В зависимости от платформы может быть возможно получить обратную трассировку и получить некоторую информацию, по крайней мере, о вызывающем, но это не очень помогает.
Для MS/GSL я предоставил некоторый код в запросе на перенос, который обогащает исключение, созданноеnarrow_cast
, но этот PR был отклонен, потому что он привлекает потоковую библиотеку. Херб Саттер, член комитета CppCoreGuidelines, сказал:
Обращение редакторов C++ Core Guidelines: похоже, требуется помощь для отладки, которая может быть дорогостоящей в режиме выпуска. Его можно было добавить только в режиме отладки и только для проектов, которые не должны изменять свои зависимости между режимами отладки и выпуска (что кажется нежелательным, поскольку ограничивает использование GSL в таких проектах). Лучше было бы использовать отладчик для просмотра информации в случае возникновения исключения, например, путем установки точки останова в реализации
narrow
.
Моя ветка удалена, но ее можно восстановить, если вы хотите интегрировать эту функцию в свой код.