//---------------------------------------------------------------------------------------------------------------------- /// \file /// Base exception class; all exceptions thrown should either be this class or derive from it. /// You cannot throw this Exception directly - instead, you must use one of the Throw class methods. // Copyright (c) Microsoft Corporation. All Rights Reserved. //---------------------------------------------------------------------------------------------------------------------- #if !defined(__WEXEXCEPTION_H__) && defined(_WIN32) #define __WEXEXCEPTION_H__ #include "Wex.Common.h" #include "Throw.h" #include "WexString.h" #include namespace WEX { namespace Common { #if defined(__cpp_inline_variables) inline #else static #endif constexpr wchar_t c_szExceptionMessageUnavailable[] = L"Error retrieving exception message; possibly out of memory."; class WEXCOMMON_API Exception { // Only allow Throw to construct Exception objects. friend void Throw::Private::ThrowImpl(HRESULT, const wchar_t*); public: Exception(const Exception& other); virtual ~Exception(); // Returns the message (if any) that was passed into the Exception constructor. _Ret_z_ const unsigned short* Message() const { return reinterpret_cast(m_pszMessage ? m_pszMessage : c_szExceptionMessageUnavailable); } #pragma warning(suppress:28196) // The static analyzer is not taking the _Field_range_ annotation under consideration when enforcing _Ret_range_. // Returns the HRESULT that was passed into the Exception constructor. _Ret_range_(<,0) HRESULT ErrorCode() const { return m_hresult; } protected: // Don't use "throw Exception()". Use Throw::() instead. explicit Exception(_In_range_(<, 0) HRESULT errorCode); Exception(_In_range_(<, 0) HRESULT errorCode, _In_opt_z_ const wchar_t* pszMessage); Exception(_In_range_(<, 0) HRESULT errorCode, const WEX::Common::String& message); #if defined(WEXCOMMON_FULL_BUILD) Exception(_In_range_(<, 0) HRESULT errorCode, _In_opt_z_ const unsigned short* pszMessage); #endif private: Exception& operator=(const Exception&) = delete; // Making 'operator new' private prevents heap allocation of Exception and forces Exception instances // to be thrown by value. static void* operator new(size_t) = delete; // Making 'operator delete' private for consistency with 'operator new'. // This is implemented to prevent errors due to references from compiler-generated functions. static void operator delete(void*) {} _Field_range_(<,0) const HRESULT m_hresult; // m_reserved and m_pReserved are not currently used. They exist to ensure the class has the size expected by code built against older TAEF headers. const void* const m_pReserved = nullptr; const long m_reserved = 0; const wchar_t* m_pszMessage; }; }/* namespace Common */}/* namespace WEX */ #endif // #if !defined(__WEXEXCEPTION_H__) && defined(_WIN32)