Наткнулся я тут на интересную багу (как мне во всяком случае кажется) в роботе с исключениями у MSVC
| Код |
| #include <string>
#include <iostream>
#include <exception>
void print_except(std::exception_ptr exc)
{
const int uncaught_except_count{ std::uncaught_exceptions() };
if (exc)
{
try
{
std::rethrow_exception(exc);
}
catch (const std::exception& std_exc)
{
std::cout << "[uncaught-except: " << uncaught_except_count << "] except-what: " << std_exc.what() << std::endl;
}
catch (...)
{
std::cout << "[uncaught-except: " << uncaught_except_count << "] <unknown-except>" << std::endl;
}
}
else
{
std::cout << "[uncaught-except: " << uncaught_except_count << "] <unknown-except: null-except-or-exists-uncaught-exceptions>" << std::endl;
}
}
class ExceptGuard
{
public:
ExceptGuard(std::string message)
: m_message(std::move(message))
{}
~ExceptGuard() noexcept(false)
{
try
{
throw std::runtime_error(m_message);
}
catch (...)
{
print_except(std::current_exception());
}
}
private:
std::string m_message;
};
int main()
{
try
{
const ExceptGuard except_guard{ "except_1" };
throw std::runtime_error("except_2");
}
catch (...)
{
print_except(std::current_exception());
}
return 0;
}
|
| |
| Out: vc++ |
| [uncaught-except: 1] <unknown-except: null-except-or-exists-uncaught-exceptions>
[uncaught-except: 0] except-what: except_2
|
| |
| Out: clang & gcc |
| [uncaught-except: 1] except-what: except_1
[uncaught-except: 0] except-what: except_2
|
| |
Здравствуйте, _niko_, Вы писали:
__>Наткнулся я тут на интересную багу (как мне во всяком случае кажется) в роботе с исключениями у MSVC
Хороший вопрос баг ли это.
Код excptptr.cpp обрабатывает исключения из деструктора по особенному и передаёт явно null:
shared_ptr<__ExceptionPtr> __ExceptionPtr::_CurrentException()
{
...
if (_pCurrentException == NULL || // no exception in flight
__ProcessingThrow != 0 || // we are unwinding... possibly called from a dtor()
...
{
// return a NULL exception_ptr
return shared_ptr<__ExceptionPtr>();
}
...
}
Здравствуйте, _NN_, Вы писали:
Судя по
Can I use std::current_exception during stack unwinding? компилятор вправе возвращать null.
Здравствуйте, _NN_, Вы писали:
_NN>Здравствуйте, _NN_, Вы писали:
_NN>Судя по Can I use std::current_exception during stack unwinding? компилятор вправе возвращать null.
Из catch вызывается или не из catch, разница есть?
Это похоже на
этот баг. Вон и Степан пишет, что разберётся.
Здравствуйте, -MyXa-, Вы писали:
MX>Здравствуйте, _NN_, Вы писали:
_NN>>Здравствуйте, _NN_, Вы писали:
_NN>>Судя по Can I use std::current_exception during stack unwinding? компилятор вправе возвращать null.
MX>Из catch вызывается или не из catch, разница есть?
MX>Это похоже на этот баг. Вон и Степан пишет, что разберётся.
Думает убирать или не убирать проверку "__ProcessingThrow != 0" ?
</щютка>
Интересно. Проголосовал.