Обработка ошибок с помощью основных рекомендаций 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.

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

Другие вопросы по тегам