vc++ vs std::current_exception()
От: _niko_ Россия  
Дата: 16.04.19 09:36
Оценка:
Наткнулся я тут на интересную багу (как мне во всяком случае кажется) в роботе с исключениями у 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
Re: vc++ vs std::current_exception()
От: _NN_ www.nemerleweb.com
Дата: 16.04.19 16:51
Оценка:
Здравствуйте, _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>();
        }
...
    }
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[2]: vc++ vs std::current_exception()
От: _NN_ www.nemerleweb.com
Дата: 16.04.19 17:55
Оценка:
Здравствуйте, _NN_, Вы писали:

Судя по Can I use std::current_exception during stack unwinding? компилятор вправе возвращать null.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[3]: vc++ vs std::current_exception()
От: -MyXa- Россия  
Дата: 16.04.19 18:08
Оценка: 18 (2)
Здравствуйте, _NN_, Вы писали:

_NN>Здравствуйте, _NN_, Вы писали:


_NN>Судя по Can I use std::current_exception during stack unwinding? компилятор вправе возвращать null.


Из catch вызывается или не из catch, разница есть?
Это похоже на этот баг. Вон и Степан пишет, что разберётся.
Если не поможет, будем действовать током... 600 Вольт (C)
Re[4]: vc++ vs std::current_exception()
От: _NN_ www.nemerleweb.com
Дата: 16.04.19 18:51
Оценка:
Здравствуйте, -MyXa-, Вы писали:

MX>Здравствуйте, _NN_, Вы писали:


_NN>>Здравствуйте, _NN_, Вы писали:


_NN>>Судя по Can I use std::current_exception during stack unwinding? компилятор вправе возвращать null.


MX>Из catch вызывается или не из catch, разница есть?

MX>Это похоже на этот баг. Вон и Степан пишет, что разберётся.
Думает убирать или не убирать проверку "__ProcessingThrow != 0" ? </щютка>
Интересно. Проголосовал.
http://rsdn.nemerleweb.com
http://nemerleweb.com
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.