blob: a1b6530a743d480d72b660ce533fa2f5027519e6 [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
#ifndef TOOLS_DIAGNOSE_EX_H
#define TOOLS_DIAGNOSE_EX_H
#include <osl/diagnose.h>
#include <rtl/ustring.hxx>
#include <com/sun/star/uno/RuntimeException.hpp>
#include <com/sun/star/lang/IllegalArgumentException.hpp>
#include <boost/current_function.hpp>
#define OSL_UNUSED( expression ) \
(void)(expression)
#if OSL_DEBUG_LEVEL > 0
#include <cppuhelper/exc_hlp.hxx>
#include <osl/diagnose.h>
#include <osl/thread.h>
#include <boost/current_function.hpp>
#include <typeinfo>
/** reports a caught UNO exception via OSL diagnostics
Note that whenever you use this, it might be an indicator that your error
handling is not correct ....
*/
#define DBG_UNHANDLED_EXCEPTION() \
::com::sun::star::uno::Any caught( ::cppu::getCaughtException() ); \
::rtl::OString sMessage( "caught an exception!" ); \
sMessage += "\nin function:"; \
sMessage += BOOST_CURRENT_FUNCTION; \
sMessage += "\ntype: "; \
sMessage += ::rtl::OString( caught.getValueTypeName().getStr(), caught.getValueTypeName().getLength(), osl_getThreadTextEncoding() ); \
::com::sun::star::uno::Exception exception; \
caught >>= exception; \
if ( exception.Message.getLength() ) \
{ \
sMessage += "\nmessage: "; \
sMessage += ::rtl::OString( exception.Message.getStr(), exception.Message.getLength(), osl_getThreadTextEncoding() ); \
} \
if ( exception.Context.is() ) \
{ \
const char* pContext = typeid( *exception.Context.get() ).name(); \
sMessage += "\ncontext: "; \
sMessage += pContext; \
} \
sMessage += "\n"; \
OSL_ENSURE( false, sMessage )
#else // OSL_DEBUG_LEVEL
#define DBG_UNHANDLED_EXCEPTION()
#endif // OSL_DEBUG_LEVEL
/** This macro asserts the given condition (in debug mode), and throws
an IllegalArgumentException afterwards.
*/
#define ENSURE_ARG_OR_THROW(c, m) if( !(c) ) { \
OSL_ENSURE(c, m); \
throw ::com::sun::star::lang::IllegalArgumentException( \
::rtl::OUString::createFromAscii(BOOST_CURRENT_FUNCTION) + \
::rtl::OUString::createFromAscii( ",\n" m), \
::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >(), \
0 ); }
#define ENSURE_ARG_OR_THROW2(c, m, ifc, arg) if( !(c) ) { \
OSL_ENSURE(c, m); \
throw ::com::sun::star::lang::IllegalArgumentException( \
::rtl::OUString::createFromAscii(BOOST_CURRENT_FUNCTION) + \
::rtl::OUString::createFromAscii( ",\n" m), \
ifc, \
arg ); }
/** This macro asserts the given condition (in debug mode), and throws
an RuntimeException afterwards.
*/
#define ENSURE_OR_THROW(c, m) if( !(c) ) { \
OSL_ENSURE(c, m); \
throw ::com::sun::star::uno::RuntimeException( \
::rtl::OUString::createFromAscii(BOOST_CURRENT_FUNCTION) + \
::rtl::OUString::createFromAscii( ",\n" m), \
::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >() ); }
#define ENSURE_OR_THROW2(c, m, ifc) if( !(c) ) { \
OSL_ENSURE(c, m); \
throw ::com::sun::star::uno::RuntimeException( \
::rtl::OUString::createFromAscii(BOOST_CURRENT_FUNCTION) + \
::rtl::OUString::createFromAscii( ",\n" m), \
ifc ); }
/** This macro asserts the given condition (in debug mode), and
returns the given value afterwards.
*/
#define ENSURE_OR_RETURN(c, m, r) if( !(c) ) { \
OSL_ENSURE(c, m); \
return r; }
/** This macro asserts the given condition (in debug mode), and
returns false afterwards.
*/
#define ENSURE_OR_RETURN_FALSE(c, m) \
ENSURE_OR_RETURN(c, m, false)
/** This macro asserts the given condition (in debug mode), and
returns afterwards, without return value "void".
*/
#define ENSURE_OR_RETURN_VOID( c, m ) \
if( !(c) ) \
{ \
OSL_ENSURE( c, m ); \
return; \
}
/** This macro asserts the given condition (in debug mode), and
returns afterwards, without return value "void".
*/
#define ENSURE_OR_RETURN_VOID( c, m ) \
if( !(c) ) \
{ \
OSL_ENSURE( c, m ); \
return; \
}
/** asserts a given condition (in debug mode), and continues the most-inner
loop if the condition is not met
*/
#define ENSURE_OR_CONTINUE( c, m ) \
if ( !(c) ) \
{ \
OSL_ENSURE( false, m ); \
continue; \
}
/** asserts a given condition (in debug mode), and continues the most-inner
loop if the condition is not met
*/
#define ENSURE_OR_BREAK( c, m ) \
if ( !(c) ) \
{ \
OSL_ENSURE( false, m ); \
break; \
}
#endif // TOOLS_DIAGNOSE_EX_H