forked from boostorg/throw_exception
Boost Exception In other libraries, watch for compile error referring to throw_exception_assert_compatibility in boost::throw_exception. Resolve by throwing an exception that derives from std::exception. This is not a new requirement but it is being enforced now.
[SVN r46818]
This commit is contained in:
committed by
Peter Dimov
parent
09c7cb53c9
commit
ac073290ab
67
doc/throw_exception.html
Normal file
67
doc/throw_exception.html
Normal file
@ -0,0 +1,67 @@
|
|||||||
|
<!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.0 Strict//EN'
|
||||||
|
'http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd'>
|
||||||
|
<html xmlns='http://www.w3.org/1999/xhtml' xml:lang='en' lang='en'>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv='Content-Type' content='text/html; charset=utf-8'/>
|
||||||
|
<title>throw_exception</title>
|
||||||
|
<link href='reno.css' type='text/css' rel='stylesheet'/>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="body-0">
|
||||||
|
<div class="body-1">
|
||||||
|
<div class="body-2">
|
||||||
|
<div>
|
||||||
|
<div id="boost_logo">
|
||||||
|
<a href="http://www.boost.org"><img style="border:0" src="http://www.boost.org/boost.png" alt="Boost" width="277" height="86"/></a>
|
||||||
|
</div>
|
||||||
|
<h1>Boost Exception</h1>
|
||||||
|
</div>
|
||||||
|
<!-- Copyright (c) 2006-2008 Emil Dotchevski and Reverge Studios, Inc. -->
|
||||||
|
<!-- 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) -->
|
||||||
|
<div class="RenoIncludeDIV"><h3>throw_exception</h3>
|
||||||
|
<div class="RenoIncludeDIV"><p><span class="RenoEscape">#<!--<wiki>`#</wiki>--></span>include <<span class="RenoLink"><a href="throw_exception_hpp.html">boost/throw_exception.hpp</a></span>></p>
|
||||||
|
<pre>namespace
|
||||||
|
boost
|
||||||
|
{
|
||||||
|
<span class="RenoIncludeSPAN"> #ifdef BOOST_NO_EXCEPTIONS
|
||||||
|
|
||||||
|
void <span class="RenoLink"><a href="throw_exception.html">throw_exception</a></span>( std::exception const & e ); // user defined
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
template <class E>
|
||||||
|
void <span class="RenoLink"><a href="throw_exception.html">throw_exception</a></span>( E const & e );
|
||||||
|
|
||||||
|
#endif</span>
|
||||||
|
}</pre>
|
||||||
|
</div><h4>Requirements:</h4>
|
||||||
|
<p>E must derive publicly from std::exception.</p>
|
||||||
|
<h4>Effects:</h4>
|
||||||
|
<div><ul><li> If BOOST_NO_EXCEPTIONS is not defined, boost::<span class="RenoLink"><a href="throw_exception.html">throw_exception</a></span>(e) is equivalent to throw boost::<span class="RenoLink"><a href="enable_current_exception.html">enable_current_exception</a></span>(boost::<span class="RenoLink"><a href="enable_error_info.html">enable_error_info</a></span>(e)), unless BOOST_EXCEPTION_DISABLE is defined, in which case boost::<span class="RenoLink"><a href="throw_exception.html">throw_exception</a></span>(e) is equivalent to throw e;</li>
|
||||||
|
<li> If BOOST_NO_EXCEPTIONS is defined, the function is left undefined, and the user is expected to supply an appropriate definition. Callers of throw_exception are allowed to assume that the function never returns; therefore, if the user-defined throw_exception returns, the behavior is undefined.</li>
|
||||||
|
</ul></div>
|
||||||
|
</div><h3>See also:</h3>
|
||||||
|
<div class="RenoPageList"><a href="boost-exception.html">Boost Exception<br/>
|
||||||
|
</a><a href="throw_exception_hpp.html">boost/throw_exception.hpp<br/>
|
||||||
|
</a><a href="enable_current_exception.html">enable_current_exception<br/>
|
||||||
|
</a><a href="tutorial_exception_ptr.html">Tutorial: Transporting of Exceptions between Threads<br/>
|
||||||
|
</a></div>
|
||||||
|
<!-- Copyright (c) 2006-2008 Emil Dotchevski and Reverge Studios, Inc. -->
|
||||||
|
<!-- 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) -->
|
||||||
|
<div id="footer">
|
||||||
|
<p> </p>
|
||||||
|
<hr/>
|
||||||
|
<p>
|
||||||
|
<a class="logo" href="http://jigsaw.w3.org/css-validator/validator?uri=http://revergestudios.com/boost-exception/reno.css"><img class="logo_pic" src="valid-css.png" alt="Valid CSS" height="31" width="88"/></a>
|
||||||
|
<a class="logo" href="http://validator.w3.org/check?uri=referer"><img class="logo_pic" src="valid-xhtml.png" alt="Valid XHTML 1.0" height="31" width="88"/></a>
|
||||||
|
<small>Copyright (c) 2006-2008 by Emil Dotchevski and Reverge Studios, Inc.<br/>
|
||||||
|
Distributed under the <a href="http://www.boost.org/LICENSE_1_0.txt">Boost Software License, Version 1.0</a>.</small>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
127
include/boost/exception/exception.hpp
Normal file
127
include/boost/exception/exception.hpp
Normal file
@ -0,0 +1,127 @@
|
|||||||
|
//Copyright (c) 2006-2008 Emil Dotchevski and Reverge Studios, Inc.
|
||||||
|
|
||||||
|
//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 UUID_274DA366004E11DCB1DDFE2E56D89593
|
||||||
|
#define UUID_274DA366004E11DCB1DDFE2E56D89593
|
||||||
|
|
||||||
|
#include <boost/config.hpp>
|
||||||
|
#include <boost/detail/workaround.hpp>
|
||||||
|
#include <boost/exception/detail/counted_base.hpp>
|
||||||
|
#include <boost/intrusive_ptr.hpp>
|
||||||
|
#include <typeinfo>
|
||||||
|
|
||||||
|
namespace
|
||||||
|
boost
|
||||||
|
{
|
||||||
|
template <class T>
|
||||||
|
class shared_ptr;
|
||||||
|
|
||||||
|
namespace
|
||||||
|
exception_detail
|
||||||
|
{
|
||||||
|
class error_info_base;
|
||||||
|
|
||||||
|
struct
|
||||||
|
error_info_container:
|
||||||
|
public exception_detail::counted_base
|
||||||
|
{
|
||||||
|
virtual char const * diagnostic_information( char const *, std::type_info const & ) const = 0;
|
||||||
|
virtual shared_ptr<error_info_base const> get( std::type_info const & ) const = 0;
|
||||||
|
virtual void set( shared_ptr<error_info_base const> const & ) = 0;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class Tag,class T>
|
||||||
|
class error_info;
|
||||||
|
|
||||||
|
template <class E,class Tag,class T>
|
||||||
|
E const & operator<<( E const &, error_info<Tag,T> const & );
|
||||||
|
|
||||||
|
template <class ErrorInfo,class E>
|
||||||
|
shared_ptr<typename ErrorInfo::value_type const> get_error_info( E const & );
|
||||||
|
|
||||||
|
class
|
||||||
|
exception
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
virtual
|
||||||
|
char const *
|
||||||
|
what() const throw()
|
||||||
|
{
|
||||||
|
return diagnostic_information();
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual
|
||||||
|
char const *
|
||||||
|
diagnostic_information() const throw()
|
||||||
|
{
|
||||||
|
return _diagnostic_information(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
exception()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
exception( exception const & e ):
|
||||||
|
data_(e.data_)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
char const *
|
||||||
|
_diagnostic_information( char const * std_what ) const throw()
|
||||||
|
{
|
||||||
|
if( data_ )
|
||||||
|
try
|
||||||
|
{
|
||||||
|
char const * w = data_->diagnostic_information(std_what,typeid(*this));
|
||||||
|
BOOST_ASSERT(0!=w);
|
||||||
|
return w;
|
||||||
|
}
|
||||||
|
catch(...)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
return std_what ? std_what : typeid(*this).name();
|
||||||
|
}
|
||||||
|
|
||||||
|
#if BOOST_WORKAROUND( BOOST_MSVC, BOOST_TESTED_AT(1500) )
|
||||||
|
//Force class exception to be abstract.
|
||||||
|
//Otherwise, MSVC bug allows throw exception(), even though the copy constructor is protected.
|
||||||
|
virtual ~exception() throw()=0;
|
||||||
|
#else
|
||||||
|
#if BOOST_WORKAROUND( __GNUC__, BOOST_TESTED_AT(4) )
|
||||||
|
virtual //Disable bogus GCC warning.
|
||||||
|
#endif
|
||||||
|
~exception() throw()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
shared_ptr<exception_detail::error_info_base const> get( std::type_info const & ) const;
|
||||||
|
void set( shared_ptr<exception_detail::error_info_base const> const & ) const;
|
||||||
|
|
||||||
|
template <class E,class Tag,class T>
|
||||||
|
friend E const & operator<<( E const &, error_info<Tag,T> const & );
|
||||||
|
|
||||||
|
template <class ErrorInfo,class E>
|
||||||
|
friend shared_ptr<typename ErrorInfo::value_type const> get_error_info( E const & );
|
||||||
|
|
||||||
|
intrusive_ptr<exception_detail::error_info_container> mutable data_;
|
||||||
|
};
|
||||||
|
|
||||||
|
#if BOOST_WORKAROUND( BOOST_MSVC, BOOST_TESTED_AT(1500) ) //See above.
|
||||||
|
inline
|
||||||
|
exception::
|
||||||
|
~exception() throw()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
@ -11,6 +11,7 @@
|
|||||||
// boost/throw_exception.hpp
|
// boost/throw_exception.hpp
|
||||||
//
|
//
|
||||||
// Copyright (c) 2002 Peter Dimov and Multi Media Ltd.
|
// Copyright (c) 2002 Peter Dimov and Multi Media Ltd.
|
||||||
|
// Copyright (c) 2008 Emil Dotchevski and Reverge Studios, Inc.
|
||||||
//
|
//
|
||||||
// Distributed under the Boost Software License, Version 1.0. (See
|
// Distributed under the Boost Software License, Version 1.0. (See
|
||||||
// accompanying file LICENSE_1_0.txt or copy at
|
// accompanying file LICENSE_1_0.txt or copy at
|
||||||
@ -20,9 +21,20 @@
|
|||||||
//
|
//
|
||||||
|
|
||||||
#include <boost/config.hpp>
|
#include <boost/config.hpp>
|
||||||
|
#include <boost/detail/workaround.hpp>
|
||||||
|
#include <exception>
|
||||||
|
|
||||||
#ifdef BOOST_NO_EXCEPTIONS
|
#if !defined( BOOST_EXCEPTION_DISABLE ) && defined( __BORLANDC__ ) && BOOST_WORKAROUND( __BORLANDC__, < 0x590 )
|
||||||
# include <exception>
|
# define BOOST_EXCEPTION_DISABLE
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined( BOOST_EXCEPTION_DISABLE ) && defined( BOOST_MSVC ) && BOOST_WORKAROUND( BOOST_MSVC, < 1310 )
|
||||||
|
# define BOOST_EXCEPTION_DISABLE
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined( BOOST_NO_EXCEPTIONS ) && !defined( BOOST_EXCEPTION_DISABLE )
|
||||||
|
# include <boost/exception/enable_current_exception.hpp>
|
||||||
|
# include <boost/exception/enable_error_info.hpp>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
namespace boost
|
namespace boost
|
||||||
@ -30,13 +42,23 @@ namespace boost
|
|||||||
|
|
||||||
#ifdef BOOST_NO_EXCEPTIONS
|
#ifdef BOOST_NO_EXCEPTIONS
|
||||||
|
|
||||||
void throw_exception(std::exception const & e); // user defined
|
void throw_exception( std::exception const & e ); // user defined
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
template<class E> inline void throw_exception(E const & e)
|
inline void throw_exception_assert_compatibility( std::exception const & ) { }
|
||||||
|
|
||||||
|
template<class E> inline void throw_exception( E const & e )
|
||||||
{
|
{
|
||||||
|
//All boost exceptions are required to derive std::exception,
|
||||||
|
//to ensure compatibility with BOOST_NO_EXCEPTIONS.
|
||||||
|
throw_exception_assert_compatibility(e);
|
||||||
|
|
||||||
|
#ifndef BOOST_EXCEPTION_DISABLE
|
||||||
|
throw enable_current_exception(enable_error_info(e));
|
||||||
|
#else
|
||||||
throw e;
|
throw e;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
18
test/throw_exception_fail.cpp
Normal file
18
test/throw_exception_fail.cpp
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
//Copyright (c) 2006-2008 Emil Dotchevski and Reverge Studios, Inc.
|
||||||
|
|
||||||
|
//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)
|
||||||
|
|
||||||
|
#include <boost/throw_exception.hpp>
|
||||||
|
|
||||||
|
struct
|
||||||
|
my_exception
|
||||||
|
{
|
||||||
|
};
|
||||||
|
|
||||||
|
void
|
||||||
|
tester()
|
||||||
|
{
|
||||||
|
//Must not compile, throw_exception requires exception types to derive std::exception.
|
||||||
|
boost::throw_exception(my_exception());
|
||||||
|
}
|
Reference in New Issue
Block a user