catch2/include/internal/catch_exception_translator_registry.hpp
Phil Nash 0dd3c57221 Fix for GitHub issue #71
Fixed memory leak in exception translator registry
2012-02-18 19:14:09 +00:00

90 lines
2.3 KiB
C++

/*
* catch_exception_translator_registry.hpp
* Catch
*
* Created by Phil on 20/04/2011.
* Copyright 2011 Two Blue Cubes Ltd. All rights reserved.
*
* Distributed under the Boost Software License, Version 1.0. (See accompanying
* file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
*
*/
#ifndef TWOBLUECUBES_CATCH_EXCEPTION_TRANSLATOR_HPP_INCLUDED
#define TWOBLUECUBES_CATCH_EXCEPTION_TRANSLATOR_HPP_INCLUDED
#include "catch_interfaces_exception.h"
namespace Catch
{
class ExceptionTranslatorRegistry : public IExceptionTranslatorRegistry
{
///////////////////////////////////////////////////////////////////////
~ExceptionTranslatorRegistry
()
{
deleteAll( m_translators );
}
///////////////////////////////////////////////////////////////////////
virtual void registerTranslator
(
IExceptionTranslator* translator
)
{
m_translators.push_back( translator );
}
///////////////////////////////////////////////////////////////////////
virtual std::string translateActiveException
()
const
{
try
{
throw;
}
catch( std::exception& ex )
{
return ex.what();
}
catch( std::string& msg )
{
return msg;
}
catch( const char* msg )
{
return msg;
}
catch(...)
{
return tryTranslators( m_translators.begin() );
}
}
///////////////////////////////////////////////////////////////////////
std::string tryTranslators
(
std::vector<IExceptionTranslator*>::const_iterator it
)
const
{
if( it == m_translators.end() )
return "Unknown exception";
try
{
return (*it)->translate();
}
catch(...)
{
return tryTranslators( it+1 );
}
}
private:
std::vector<IExceptionTranslator*> m_translators;
};
}
#endif // TWOBLUECUBES_CATCH_EXCEPTION_TRANSLATOR_HPP_INCLUDED