cpp-ru / ideas

Идеи по улучшению языка C++ для обсуждения
https://cpp-ru.github.io/proposals
Creative Commons Zero v1.0 Universal
89 stars 0 forks source link

добавить функцию exception_type(p) для std::exception_ptr #463

Open gleb-kov opened 3 years ago

gleb-kov commented 3 years ago

<Описание вашей идеи> Хочется знать информацию о типе исключения из std::exception_ptr.

Например, с помощью функции с сигнатурой: std::type_info* exception_type(std::exception_ptr)

Смотрелось бы лучше как метод у std::exception_ptr, возвращающий const std::type_info&, но тип std::exception_ptr не специфирован.

Нечто похожее: __cxa_current_exception_type

<Примеры, где ваша идея будет полезна. Чем больше примеров и чем большую аудиторию они охватывают - тем лучше> Логгирование и дебаг

try {
  ...
} catch(...) {
  std::cerr << "Caught exception " << std::exception_type(std::current_exception())->name() << ", exit.";
  // или std::current_exception()->type().name()
  ...
}
apolukhin commented 2 years ago

А чем именно не подходит использование std::exception:

try {
  ...
} catch(const std::exception& exc) {
  std::cerr << "Caught exception " << typeid(exc).name() << ", exit.";
}
gleb-kov commented 2 years ago

Да, это простой случай и здесь всё понятно. Есть кодовая база, где доступен только std::exception_ptr, чтобы заработало с ним, нужно пользоваться лапшой из try-catch-rethrow-try-catch. Например, здесь https://github.com/ClickHouse/ClickHouse/blob/0b67f593e059311966122c5529b3f6434feea946/src/Common/Exception.cpp -- показательный пример с tryLogException, эта конструкция с rethrow очень частая в репозиториях со своим util и тд. Кажется, проще бы было делать свитч по типу известному из std::exception_ptr. Возможно, есть ограничение из std, которые помешают такой реализации.

Ещё есть случай, когда брошено нечто ненаследуемое от std::exception. Это не идеологично конечно, но такого кода тоже много.