forked from boostorg/throw_exception
Boost Exception major refactoring: works with or without RTTI, vastly improved boost::throw_exception integration.
[SVN r48905]
This commit is contained in:
committed by
Peter Dimov
parent
4ae98c397c
commit
fc1d3ff88b
57
doc/BOOST_THROW_EXCEPTION.html
Normal file
57
doc/BOOST_THROW_EXCEPTION.html
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
<!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>BOOST_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"><div class="RenoAutoDIV"><h3>BOOST_THROW_EXCEPTION</h3>
|
||||||
|
</div>
|
||||||
|
<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>
|
||||||
|
<div class="RenoIncludeDIV"><pre>#if !defined( BOOST_NO_EXCEPTIONS ) && !defined( BOOST_EXCEPTION_DISABLE )
|
||||||
|
#include <<span class="RenoLink"><a href="exception_exception_hpp.html">boost/exception/exception.hpp</a></span>>
|
||||||
|
#include <boost/current_function.hpp>
|
||||||
|
#define <span class="RenoLink"><a href="BOOST_THROW_EXCEPTION.html">BOOST_THROW_EXCEPTION</a></span>(x)\
|
||||||
|
::boost::<span class="RenoLink"><a href="throw_exception.html">throw_exception</a></span>( ::boost::<span class="RenoLink"><a href="enable_error_info.html">enable_error_info</a></span>(x) <<\
|
||||||
|
::boost::<span class="RenoLink"><a href="exception_exception_hpp.html">throw_function</a></span>(BOOST_CURRENT_FUNCTION) <<\
|
||||||
|
::boost::<span class="RenoLink"><a href="exception_exception_hpp.html">throw_file</a></span>(__FILE__) <<\
|
||||||
|
::boost::<span class="RenoLink"><a href="exception_exception_hpp.html">throw_line</a></span>((int)__LINE__) )
|
||||||
|
#else
|
||||||
|
#define <span class="RenoLink"><a href="BOOST_THROW_EXCEPTION.html">BOOST_THROW_EXCEPTION</a></span>(x) ::boost::<span class="RenoLink"><a href="throw_exception.html">throw_exception</a></span>(x)
|
||||||
|
#endif</pre>
|
||||||
|
</div></div><p>This macro takes an exception object, records BOOST_CURRENT_FUNCTION, __FILE__ and __LINE__ in it, and forwards it to <span class="RenoLink"><a href="throw_exception.html">throw_exception</a></span>. To recover this information at the catch site, use <span class="RenoLink"><a href="get_error_info.html">get_error_info</a></span>; the information is also included in the message returned by <span class="RenoLink"><a href="diagnostic_information.html">diagnostic_information</a></span>.</p>
|
||||||
|
</div><div class="RenoPageList"><a href="boost-exception.html">Boost Exception<br/>
|
||||||
|
</a><a href="throw_exception_hpp.html">boost/throw_exception.hpp<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>
|
@ -26,14 +26,10 @@
|
|||||||
boost
|
boost
|
||||||
{
|
{
|
||||||
<span class="RenoIncludeSPAN">#ifdef BOOST_NO_EXCEPTIONS
|
<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
|
void <span class="RenoLink"><a href="throw_exception.html">throw_exception</a></span>( std::exception const & e ); // user defined
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
template <class E>
|
template <class E>
|
||||||
void <span class="RenoLink"><a href="throw_exception.html">throw_exception</a></span>( E const & e );
|
void <span class="RenoLink"><a href="throw_exception.html">throw_exception</a></span>( E const & e );
|
||||||
|
|
||||||
#endif</span>
|
#endif</span>
|
||||||
}</pre>
|
}</pre>
|
||||||
</div><h4>Requirements:</h4>
|
</div><h4>Requirements:</h4>
|
||||||
@ -44,8 +40,10 @@ boost
|
|||||||
</ul></div>
|
</ul></div>
|
||||||
</div><div class="RenoAutoDIV"><div class="RenoHR"><hr/></div>
|
</div><div class="RenoAutoDIV"><div class="RenoHR"><hr/></div>
|
||||||
<h3>See Also:</h3>
|
<h3>See Also:</h3>
|
||||||
<div class="RenoPageList"><a href="boost-exception.html">Boost Exception<br/>
|
<div class="RenoPageList"><a href="BOOST_THROW_EXCEPTION.html">BOOST_THROW_EXCEPTION<br/>
|
||||||
|
</a><a href="boost-exception.html">Boost Exception<br/>
|
||||||
</a><a href="throw_exception_hpp.html">boost/throw_exception.hpp<br/>
|
</a><a href="throw_exception_hpp.html">boost/throw_exception.hpp<br/>
|
||||||
|
</a><a href="configuration_macros.html">Configuration Macros<br/>
|
||||||
</a><a href="enable_current_exception.html">enable_current_exception<br/>
|
</a><a href="enable_current_exception.html">enable_current_exception<br/>
|
||||||
</a><a href="tutorial_exception_ptr.html">Transporting of Exceptions Between Threads<br/>
|
</a><a href="tutorial_exception_ptr.html">Transporting of Exceptions Between Threads<br/>
|
||||||
</a></div>
|
</a></div>
|
||||||
|
@ -6,115 +6,390 @@
|
|||||||
#ifndef UUID_274DA366004E11DCB1DDFE2E56D89593
|
#ifndef UUID_274DA366004E11DCB1DDFE2E56D89593
|
||||||
#define 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
|
namespace
|
||||||
boost
|
boost
|
||||||
|
{
|
||||||
|
namespace
|
||||||
|
exception_detail
|
||||||
{
|
{
|
||||||
template <class T>
|
template <class T>
|
||||||
|
class
|
||||||
|
refcount_ptr
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
refcount_ptr():
|
||||||
|
px_(0)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
~refcount_ptr()
|
||||||
|
{
|
||||||
|
release();
|
||||||
|
}
|
||||||
|
|
||||||
|
refcount_ptr( refcount_ptr const & x ):
|
||||||
|
px_(x.px_)
|
||||||
|
{
|
||||||
|
add_ref();
|
||||||
|
}
|
||||||
|
|
||||||
|
refcount_ptr &
|
||||||
|
operator=( refcount_ptr const & x )
|
||||||
|
{
|
||||||
|
adopt(x.px_);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
adopt( T * px )
|
||||||
|
{
|
||||||
|
release();
|
||||||
|
px_=px;
|
||||||
|
add_ref();
|
||||||
|
}
|
||||||
|
|
||||||
|
T *
|
||||||
|
get() const
|
||||||
|
{
|
||||||
|
return px_;
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
T * px_;
|
||||||
|
|
||||||
|
void
|
||||||
|
add_ref()
|
||||||
|
{
|
||||||
|
if( px_ )
|
||||||
|
px_->add_ref();
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
release()
|
||||||
|
{
|
||||||
|
if( px_ )
|
||||||
|
px_->release();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
template <class Tag,class T>
|
||||||
|
class error_info;
|
||||||
|
|
||||||
|
typedef error_info<struct tag_throw_function,char const *> throw_function;
|
||||||
|
typedef error_info<struct tag_throw_file,char const *> throw_file;
|
||||||
|
typedef error_info<struct tag_throw_line,int> throw_line;
|
||||||
|
|
||||||
|
template <>
|
||||||
|
class
|
||||||
|
error_info<tag_throw_function,char const *>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
typedef char const * value_type;
|
||||||
|
value_type v_;
|
||||||
|
explicit
|
||||||
|
error_info( value_type v ):
|
||||||
|
v_(v)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
template <>
|
||||||
|
class
|
||||||
|
error_info<tag_throw_file,char const *>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
typedef char const * value_type;
|
||||||
|
value_type v_;
|
||||||
|
explicit
|
||||||
|
error_info( value_type v ):
|
||||||
|
v_(v)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
template <>
|
||||||
|
class
|
||||||
|
error_info<tag_throw_line,int>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
typedef int value_type;
|
||||||
|
value_type v_;
|
||||||
|
explicit
|
||||||
|
error_info( value_type v ):
|
||||||
|
v_(v)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
template <class E,class Tag,class T>
|
||||||
|
E const & operator<<( E const &, error_info<Tag,T> const & );
|
||||||
|
|
||||||
|
class exception;
|
||||||
|
|
||||||
|
template <class>
|
||||||
class shared_ptr;
|
class shared_ptr;
|
||||||
|
|
||||||
namespace
|
namespace
|
||||||
exception_detail
|
exception_detail
|
||||||
{
|
{
|
||||||
class error_info_base;
|
class error_info_base;
|
||||||
|
struct type_info_;
|
||||||
|
|
||||||
struct
|
struct
|
||||||
error_info_container:
|
error_info_container
|
||||||
public exception_detail::counted_base
|
{
|
||||||
|
virtual char const * diagnostic_information() const = 0;
|
||||||
|
virtual shared_ptr<error_info_base const> get( type_info_ const & ) const = 0;
|
||||||
|
virtual void set( shared_ptr<error_info_base const> const &, type_info_ const & ) = 0;
|
||||||
|
virtual void add_ref() const = 0;
|
||||||
|
virtual void release() const = 0;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
virtual
|
||||||
|
~error_info_container() throw()
|
||||||
{
|
{
|
||||||
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>
|
template <class>
|
||||||
class error_info;
|
struct get_info;
|
||||||
|
|
||||||
template <class E,class Tag,class T>
|
template <>
|
||||||
E const & operator<<( E const &, error_info<Tag,T> const & );
|
struct get_info<throw_function>;
|
||||||
|
|
||||||
template <class ErrorInfo,class E>
|
template <>
|
||||||
shared_ptr<typename ErrorInfo::value_type const> get_error_info( E const & );
|
struct get_info<throw_file>;
|
||||||
|
|
||||||
|
template <>
|
||||||
|
struct get_info<throw_line>;
|
||||||
|
|
||||||
|
char const * get_diagnostic_information( exception const & );
|
||||||
|
}
|
||||||
|
|
||||||
class
|
class
|
||||||
exception
|
exception
|
||||||
{
|
{
|
||||||
public:
|
|
||||||
|
|
||||||
virtual
|
|
||||||
char const *
|
|
||||||
diagnostic_information() const throw()
|
|
||||||
{
|
|
||||||
return _diagnostic_information(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
exception()
|
exception():
|
||||||
|
throw_function_(0),
|
||||||
|
throw_file_(0),
|
||||||
|
throw_line_(-1)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
exception( exception const & e ):
|
#ifdef __HP_aCC
|
||||||
data_(e.data_)
|
//On HP aCC, this protected copy constructor prevents throwing boost::exception.
|
||||||
{
|
//On all other platforms, the same effect is achieved by the pure virtual destructor.
|
||||||
}
|
exception( exception const & x ) throw():
|
||||||
|
data_(x.data_),
|
||||||
char const *
|
throw_function_(x.throw_function_),
|
||||||
_diagnostic_information( char const * std_what ) const throw()
|
throw_file_(x.throw_file_),
|
||||||
{
|
throw_line_(x.throw_line_)
|
||||||
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
|
#endif
|
||||||
|
|
||||||
|
virtual ~exception() throw()
|
||||||
|
#ifndef __HP_aCC
|
||||||
|
= 0 //Workaround for HP aCC, =0 incorrectly leads to link errors.
|
||||||
|
#endif
|
||||||
|
;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
shared_ptr<exception_detail::error_info_base const> get( std::type_info const & ) const;
|
template <class E>
|
||||||
void set( shared_ptr<exception_detail::error_info_base const> const & ) const;
|
friend
|
||||||
|
E const &
|
||||||
|
operator<<( E const & x, throw_function const & y )
|
||||||
|
{
|
||||||
|
x.throw_function_=y.v_;
|
||||||
|
return x;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class E>
|
||||||
|
friend
|
||||||
|
E const &
|
||||||
|
operator<<( E const & x, throw_file const & y )
|
||||||
|
{
|
||||||
|
x.throw_file_=y.v_;
|
||||||
|
return x;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class E>
|
||||||
|
friend
|
||||||
|
E const &
|
||||||
|
operator<<( E const & x, throw_line const & y )
|
||||||
|
{
|
||||||
|
x.throw_line_=y.v_;
|
||||||
|
return x;
|
||||||
|
}
|
||||||
|
|
||||||
|
friend char const * exception_detail::get_diagnostic_information( exception const & );
|
||||||
|
|
||||||
template <class E,class Tag,class T>
|
template <class E,class Tag,class T>
|
||||||
friend E const & operator<<( E const &, error_info<Tag,T> const & );
|
friend E const & operator<<( E const &, error_info<Tag,T> const & );
|
||||||
|
|
||||||
template <class ErrorInfo,class E>
|
template <class>
|
||||||
friend shared_ptr<typename ErrorInfo::value_type const> get_error_info( E const & );
|
friend struct exception_detail::get_info;
|
||||||
|
friend struct exception_detail::get_info<throw_function>;
|
||||||
|
friend struct exception_detail::get_info<throw_file>;
|
||||||
|
friend struct exception_detail::get_info<throw_line>;
|
||||||
|
|
||||||
intrusive_ptr<exception_detail::error_info_container> mutable data_;
|
mutable exception_detail::refcount_ptr<exception_detail::error_info_container> data_;
|
||||||
|
mutable char const * throw_function_;
|
||||||
|
mutable char const * throw_file_;
|
||||||
|
mutable int throw_line_;
|
||||||
};
|
};
|
||||||
|
|
||||||
#if BOOST_WORKAROUND( BOOST_MSVC, BOOST_TESTED_AT(1500) ) //See above.
|
|
||||||
inline
|
inline
|
||||||
exception::
|
exception::
|
||||||
~exception() throw()
|
~exception() throw()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
namespace
|
||||||
|
exception_detail
|
||||||
|
{
|
||||||
|
template <class T>
|
||||||
|
struct
|
||||||
|
error_info_injector:
|
||||||
|
public T,
|
||||||
|
public exception
|
||||||
|
{
|
||||||
|
explicit
|
||||||
|
error_info_injector( T const & x ):
|
||||||
|
T(x)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
~error_info_injector() throw()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
struct large_size { char c[256]; };
|
||||||
|
large_size dispatch( exception * );
|
||||||
|
|
||||||
|
struct small_size { };
|
||||||
|
small_size dispatch( void * );
|
||||||
|
|
||||||
|
template <class,int>
|
||||||
|
struct enable_error_info_helper;
|
||||||
|
|
||||||
|
template <class T>
|
||||||
|
struct
|
||||||
|
enable_error_info_helper<T,sizeof(large_size)>
|
||||||
|
{
|
||||||
|
typedef T type;
|
||||||
|
};
|
||||||
|
|
||||||
|
template <class T>
|
||||||
|
struct
|
||||||
|
enable_error_info_helper<T,sizeof(small_size)>
|
||||||
|
{
|
||||||
|
typedef error_info_injector<T> type;
|
||||||
|
};
|
||||||
|
|
||||||
|
template <class T>
|
||||||
|
struct
|
||||||
|
enable_error_info_return_type
|
||||||
|
{
|
||||||
|
typedef typename enable_error_info_helper<T,sizeof(dispatch((T*)0))>::type type;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class T>
|
||||||
|
inline
|
||||||
|
typename
|
||||||
|
exception_detail::enable_error_info_return_type<T>::type
|
||||||
|
enable_error_info( T const & x )
|
||||||
|
{
|
||||||
|
return typename exception_detail::enable_error_info_return_type<T>::type(x);
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
namespace
|
||||||
|
exception_detail
|
||||||
|
{
|
||||||
|
class
|
||||||
|
clone_base
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
virtual clone_base const * clone() const = 0;
|
||||||
|
virtual void rethrow() const = 0;
|
||||||
|
|
||||||
|
virtual
|
||||||
|
~clone_base() throw()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
inline
|
||||||
|
void
|
||||||
|
copy_boost_exception( exception * a, exception const * b )
|
||||||
|
{
|
||||||
|
*a = *b;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline
|
||||||
|
void
|
||||||
|
copy_boost_exception( void *, void const * )
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class T>
|
||||||
|
class
|
||||||
|
clone_impl:
|
||||||
|
public T,
|
||||||
|
public clone_base
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
explicit
|
||||||
|
clone_impl( T const & x ):
|
||||||
|
T(x)
|
||||||
|
{
|
||||||
|
copy_boost_exception(this,&x);
|
||||||
|
}
|
||||||
|
|
||||||
|
~clone_impl() throw()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
clone_base const *
|
||||||
|
clone() const
|
||||||
|
{
|
||||||
|
return new clone_impl(*this);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
rethrow() const
|
||||||
|
{
|
||||||
|
throw*this;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class T>
|
||||||
|
inline
|
||||||
|
exception_detail::clone_impl<T>
|
||||||
|
enable_current_exception( T const & x )
|
||||||
|
{
|
||||||
|
return exception_detail::clone_impl<T>(x);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -24,11 +24,7 @@
|
|||||||
#include <boost/detail/workaround.hpp>
|
#include <boost/detail/workaround.hpp>
|
||||||
#include <exception>
|
#include <exception>
|
||||||
|
|
||||||
#if !defined( BOOST_EXCEPTION_DISABLE ) && defined( BOOST_NO_TYPEID )
|
#if !defined( BOOST_EXCEPTION_DISABLE ) && defined( __BORLANDC__ ) && BOOST_WORKAROUND( __BORLANDC__, <= 0x593 )
|
||||||
# define BOOST_EXCEPTION_DISABLE
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if !defined( BOOST_EXCEPTION_DISABLE ) && defined( __BORLANDC__ ) && BOOST_WORKAROUND( __BORLANDC__, < 0x590 )
|
|
||||||
# define BOOST_EXCEPTION_DISABLE
|
# define BOOST_EXCEPTION_DISABLE
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -37,8 +33,14 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if !defined( BOOST_NO_EXCEPTIONS ) && !defined( BOOST_EXCEPTION_DISABLE )
|
#if !defined( BOOST_NO_EXCEPTIONS ) && !defined( BOOST_EXCEPTION_DISABLE )
|
||||||
# include <boost/exception/enable_current_exception.hpp>
|
# include <boost/exception/exception.hpp>
|
||||||
# include <boost/exception/enable_error_info.hpp>
|
# include <boost/current_function.hpp>
|
||||||
|
# define BOOST_THROW_EXCEPTION(x) ::boost::throw_exception(::boost::enable_error_info(x) <<\
|
||||||
|
::boost::throw_function(BOOST_CURRENT_FUNCTION) <<\
|
||||||
|
::boost::throw_file(__FILE__) <<\
|
||||||
|
::boost::throw_line((int)__LINE__))
|
||||||
|
#else
|
||||||
|
# define BOOST_THROW_EXCEPTION(x) ::boost::throw_exception(x)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
namespace boost
|
namespace boost
|
||||||
|
29
test/1-throw_exception_test.cpp
Normal file
29
test/1-throw_exception_test.cpp
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
//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>
|
||||||
|
#include <boost/detail/lightweight_test.hpp>
|
||||||
|
|
||||||
|
class my_exception: public std::exception { };
|
||||||
|
|
||||||
|
int
|
||||||
|
main()
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
boost::throw_exception(my_exception());
|
||||||
|
BOOST_ERROR("boost::throw_exception failed to throw.");
|
||||||
|
}
|
||||||
|
catch(
|
||||||
|
my_exception & )
|
||||||
|
{
|
||||||
|
}
|
||||||
|
catch(
|
||||||
|
... )
|
||||||
|
{
|
||||||
|
BOOST_ERROR("boost::throw_exception malfunction.");
|
||||||
|
}
|
||||||
|
return boost::report_errors();
|
||||||
|
}
|
30
test/2-throw_exception_no_exceptions_test.cpp
Normal file
30
test/2-throw_exception_no_exceptions_test.cpp
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
//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)
|
||||||
|
|
||||||
|
#define BOOST_NO_EXCEPTIONS
|
||||||
|
#include <boost/throw_exception.hpp>
|
||||||
|
#include <boost/detail/lightweight_test.hpp>
|
||||||
|
|
||||||
|
class my_exception: public std::exception { };
|
||||||
|
|
||||||
|
bool called=false;
|
||||||
|
|
||||||
|
namespace
|
||||||
|
boost
|
||||||
|
{
|
||||||
|
void
|
||||||
|
throw_exception( std::exception const & )
|
||||||
|
{
|
||||||
|
called=true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
main()
|
||||||
|
{
|
||||||
|
boost::throw_exception(my_exception());
|
||||||
|
BOOST_TEST(called);
|
||||||
|
return boost::report_errors();
|
||||||
|
}
|
30
test/3-throw_exception_no_integration_test.cpp
Normal file
30
test/3-throw_exception_no_integration_test.cpp
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
//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)
|
||||||
|
|
||||||
|
#define BOOST_EXCEPTION_DISABLE
|
||||||
|
#include <boost/throw_exception.hpp>
|
||||||
|
#include <boost/detail/lightweight_test.hpp>
|
||||||
|
|
||||||
|
class my_exception: public std::exception { };
|
||||||
|
|
||||||
|
int
|
||||||
|
main()
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
boost::throw_exception(my_exception());
|
||||||
|
BOOST_ERROR("boost::throw_exception failed to throw.");
|
||||||
|
}
|
||||||
|
catch(
|
||||||
|
my_exception & )
|
||||||
|
{
|
||||||
|
}
|
||||||
|
catch(
|
||||||
|
... )
|
||||||
|
{
|
||||||
|
BOOST_ERROR("boost::throw_exception malfunction.");
|
||||||
|
}
|
||||||
|
return boost::report_errors();
|
||||||
|
}
|
31
test/4-throw_exception_no_both_test.cpp
Normal file
31
test/4-throw_exception_no_both_test.cpp
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
//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)
|
||||||
|
|
||||||
|
#define BOOST_NO_EXCEPTIONS
|
||||||
|
#define BOOST_EXCEPTION_DISABLE
|
||||||
|
#include <boost/throw_exception.hpp>
|
||||||
|
#include <boost/detail/lightweight_test.hpp>
|
||||||
|
|
||||||
|
class my_exception: public std::exception { };
|
||||||
|
|
||||||
|
bool called=false;
|
||||||
|
|
||||||
|
namespace
|
||||||
|
boost
|
||||||
|
{
|
||||||
|
void
|
||||||
|
throw_exception( std::exception const & )
|
||||||
|
{
|
||||||
|
called=true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
main()
|
||||||
|
{
|
||||||
|
boost::throw_exception(my_exception());
|
||||||
|
BOOST_TEST(called);
|
||||||
|
return boost::report_errors();
|
||||||
|
}
|
Reference in New Issue
Block a user