ideas icon indicating copy to clipboard operation
ideas copied to clipboard

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

Open gleb-kov opened this issue 4 years ago • 2 comments

<Описание вашей идеи> Хочется знать информацию о типе исключения из 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()
  ...
}

gleb-kov avatar Jul 04 '21 16:07 gleb-kov

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

try {
  ...
} catch(const std::exception& exc) {
  std::cerr << "Caught exception " << typeid(exc).name() << ", exit.";
}

apolukhin avatar Aug 01 '21 19:08 apolukhin

Да, это простой случай и здесь всё понятно. Есть кодовая база, где доступен только 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. Это не идеологично конечно, но такого кода тоже много.

gleb-kov avatar Aug 08 '21 12:08 gleb-kov