Обработка ошибок в соответствии с основными рекомендациями GSL Expects, Supplies и weak_cast

Я стараюсь следовать основным рекомендациям Cpp и использовать GSL там, где это уместно. В частности, я хотел бы использовать Expects и Ensures для предварительных и постусловий, а также span и narrow_cast, но обработка ошибок ненадежна и не обеспечивает никакой диагностики. При обнаружении ошибок GSL просто вызывает terminate, не оставляя тестеру никаких сведений о том, что вызвало завершение работы.

Итак, мой вопрос: как использовать GSL и поддерживать надежность кода при наличии ошибок? Или, проще говоря, как использовать GSL и получить диагностику ошибок перед завершением?


person Phil    schedule 11.08.2020    source источник
comment
gsl-lite поддерживает создание исключений вместо завершения.   -  person Paul G.    schedule 15.06.2021
comment
Также gsl::narrow_cast не должно быть в этом списке, так как это просто оболочка вокруг static_cast и не завершается/выбрасывается. gsl::narrow проверяет наличие потери информации, но всегда должен выбрасывать и не завершать работу в соответствии с основными рекомендациями C++.   -  person Paul G.    schedule 15.06.2021


Ответы (1)


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

Для MS/GSL я предоставил некоторый код в запросе на извлечение, который дополняет исключение, выдаваемое narrow_cast, но этот PR был отклонен, потому что он использует потоковую библиотеку. Херб Саттер, член комитета CppCoreGuidelines, сказал:

Обращение редакторов основных рекомендаций C++: похоже, здесь запрашивается помощь в отладке, которая может быть дорогостоящей в режиме выпуска. Его можно добавить только в режиме отладки, и то только для проектов, которые не должны менять свои зависимости между режимами отладки и выпуска (что кажется нежелательным, поскольку ограничивает использование GSL в таких проектах). Лучше было бы использовать отладчик для просмотра информации, если возникнет исключение, например, установив точку останова в реализации narrow.

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

person Werner Henze    schedule 13.08.2020
comment
Спасибо за ответ! Поскольку эта тема кажется немного специфичной для StackOverflow, следует ли нам продолжить обсуждение вопроса основных рекомендаций github #1663? Я могу обобщить здесь, когда/если я получу лучший ответ, чем нет, который вы получили на свой запрос на включение. Но, честно говоря, я не понимаю, как полное завершение без малейшего намека на то, почему это произошло, полезно или даже желательно в чем-либо, кроме отладочного кода. Я думал, что аудитория GSL намного больше. - person Phil; 14.08.2020