MSVC. try/catch bug
От: qadmium  
Дата: 28.02.13 19:16
Оценка: 6 (1)
Вот такой код, эксепция не ловится в try/catch

class PluginException{};

class IPlugin
{
public:
    virtual void method() = 0;
};

class Plugin : public IPlugin
{

public:
    void method()
    {
        throw PluginException();
    }
};

class PluginWrapper
{
public:
    PluginWrapper()
        : m_plugin(new Plugin())
    {}

    bool method()
    {
        return WrapCall(m_plugin, &IPlugin::method);
    }


private:
    template <typename PluginType> 
    bool WrapCall(PluginType* plugin, void (PluginType::*Method)())
    {

        try
        {
            (plugin->*Method)();
        }
        catch (PluginException&)
        {
            return false;
        }

        return true;
    }

    IPlugin* m_plugin;
};

void main()
{
    PluginWrapper().method();
}


открываем дизассамблею, видим

    template <typename PluginType> 
    bool WrapCall(PluginType* plugin, void (PluginType::*Method)())
    {

        try
        {
            (plugin->*Method)();
00171050  call        IPlugin::`vcall'{0}' (171060h)
        }
        catch (PluginException&)
        {
            return false;
        }

        return true;
00171055  mov         al,1 
    }
00171057  ret


ловить некому

воспроизводится в msvc 2008 sp1, 2010 sp1 в дефолтной release конфигурации. В msvc 2012 не смог воспроизвести.

  1. Это известный баг? Если да, то как его обойти?
  2. Если нет, то куда писать? (ООН не предлагать )
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.