Вот такой код, эксепция не ловится в 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 не смог воспроизвести.
Это известный баг? Если да, то как его обойти?
Если нет, то куда писать? (ООН не предлагать )