27 static_assert(
deferred_false<T>::value,
"All types are required to define DECLARE_ERRORSTRUCT_FEATURES to be used as a error context type");
32 static_assert(
deferred_false<T>::value,
"All types are required to define DECLARE_ERRORSTRUCT_FEATURES to be used as a error context type");
38 static_assert(
deferred_false<T>::value,
"All types are required to define DECLARE_ERRORSTRUCT_FEATURES to be used as a error context type");
45#define UE_DECLARE_ERRORSTRUCT_FEATURES(DetailsNameSpace, DetailsStructName)\
47 class TErrorStructFeatures<UE::UnifiedError::DetailsNameSpace::DetailsStructName>\
50 static const FAnsiStringView GetErrorDetailsLogEntryNameAsString() \
52 return ANSITEXTVIEW(#DetailsNameSpace"_"#DetailsStructName);\
54 static const FAnsiStringView GetErrorDetailsTypeNameAsString() \
56 return ANSITEXTVIEW("TErrorDetails<"#DetailsNameSpace"::"#DetailsStructName">");\
58 static const FAnsiStringView GetErrorContextTypeNameAsString() \
60 return ANSITEXTVIEW(#DetailsNameSpace"::"#DetailsStructName);\
66template <
unsigned int N>
80 else if (
InStr[i] ==
':' &&
InStr[i + 1] ==
':')
85 else if (
InStr[i] !=
':')
91 for (; OutIndex < N; ++OutIndex)
101template <
unsigned int N>
110 if (
InStr[i] ==
'\0')
115 else if (
InStr[i] ==
' ')
126 for (; OutIndex < N; ++OutIndex)
128 Str[OutIndex] =
'\0';
141 Result = ((Result << 5) + Result) +
Ch;
148#define UE_DECLARE_ERROR_DETAILS_INTERNAL(DetailsNamespace, TypeName)\
149 inline static constexpr FAnsiStringView StaticGetErrorDetailsTypeName() \
151 return #DetailsNamespace"::"#TypeName;\
153 virtual const FAnsiStringView GetErrorDetailsTypeName() const override \
155 return StaticGetErrorDetailsTypeName();\
157 inline static FAnsiStringView StaticGetErrorDetailsTypeNameForLog() \
159 static auto Replaced = TStringLiteralWithColonsReplaced(#DetailsNamespace"_"#TypeName);\
160 return Replaced.Str;\
162 virtual const FAnsiStringView GetErrorDetailsTypeNameForLog() const override\
164 return StaticGetErrorDetailsTypeNameForLog(); \
166 virtual uint64 GetErrorDetailsTypeId() const \
168 return StaticGetErrorDetailsTypeId(); \
170 static uint64 StaticGetErrorDetailsTypeId() \
172 return CompileTimeHashString(StaticGetErrorDetailsTypeName().GetData()); \
176#define UE_DECLARE_FERROR_DETAILS_ABSTRACT(DetailsNamespace, TypeName)\
178 UE_DECLARE_ERROR_DETAILS_INTERNAL(DetailsNamespace, TypeName);
184#define UE_DECLARE_FERROR_DETAILS(DetailsNamespace, TypeName)\
186 UE_DECLARE_ERROR_DETAILS_INTERNAL(DetailsNamespace, TypeName);\
187 friend IErrorDetails* Create();\
188 inline static IErrorDetails* Create()\
190 return new TypeName();\
217 namespace ErrorRegistry
445 ErrorDetails =
InError.ErrorDetails;
446 InError.ErrorDetails =
nullptr;
454 ErrorDetails =
InError.ErrorDetails;
482 return &
Details->GetErrorContext();
504 return (ErrorCode != 0) && (ModuleId != 0);
511 ErrorDetails =
nullptr;
523 template<
typename DetailType>
527 while (CurrentIt !=
nullptr)
529 if (CurrentIt->GetErrorDetailsTypeId() == DetailType::StaticGetErrorDetailsTypeId())
533 CurrentIt = CurrentIt->GetInnerErrorDetails();
566 FText ErrorFormatString;
600 Writer.BeginObject();
603 Writer.AddString(
UTF8TEXTVIEW(
"ErrorCodeString"), ErrorName);
604 Writer.AddString(
UTF8TEXTVIEW(
"ModuleIdString"), ModuleName);
666#define UE_DECLARE_ERROR_MODULE(DeclareApi, ModuleName) \
667 namespace UE::UnifiedError { namespace ModuleName {\
668 DeclareApi FAnsiStringView GetStaticModuleName(); \
669 DeclareApi int32 GetStaticModuleId(); \
672#define UE_DEFINE_ERROR_MODULE(ModuleName) \
673 namespace UE::UnifiedError { namespace ModuleName {\
674 const int32 StaticModuleId = UE::UnifiedError::ErrorRegistry::RegisterModule(ANSITEXTVIEW(#ModuleName));\
675 int32 GetStaticModuleId() { return StaticModuleId; }\
676 FAnsiStringView GetStaticModuleName() \
678 static const auto Reference = TStringLiteralWithSpacesReplaced(#ModuleName); \
679 return Reference.Str; \
684#define UE_DECLARE_ERROR_INTERNAL(DeclareApi, ErrorName, ErrorCode, ModuleName, FormatString) \
685 namespace UE::UnifiedError { namespace ModuleName { namespace ErrorName {\
686 DeclareApi FAnsiStringView GetStaticErrorName(); \
687 static constexpr int32 DeclaredErrorCode = ErrorCode; \
688 extern DeclareApi const FText DeclaredFormatString; \
689 DeclareApi int32 GetErrorCodeId(); \
690 DeclareApi TRefCountPtr<const FStaticErrorDetails> GetStaticErrorDetails(); \
691 DeclareApi const FError& GetStaticError(); \
692 DeclareApi bool OfType(const FError& Other); \
693 static inline FText GetFormatString() { return FormatString; } \
696#define UE_DEFINE_ERROR(ErrorName, ModuleName) \
697 namespace UE::UnifiedError { namespace ModuleName { namespace ErrorName {\
698 const int32 ErrorCodeId = UE::UnifiedError::ErrorRegistry::RegisterErrorCode(GetStaticErrorName(), UE::UnifiedError::ModuleName::GetStaticModuleId(), DeclaredErrorCode);\
699 const FText DeclaredFormatString = GetFormatString(); \
700 int32 GetErrorCodeId() \
704 FAnsiStringView GetStaticErrorName() \
706 static const auto Reference = TStringLiteralWithSpacesReplaced(#ErrorName); \
707 return Reference.Str; \
709 TRefCountPtr<const FStaticErrorDetails> GetStaticErrorDetails() \
711 static FStaticErrorDetails StaticErrorDetails(GetStaticErrorName(), UE::UnifiedError::ModuleName::GetStaticModuleName(), DeclaredFormatString);\
712 return TRefCountPtr<const FStaticErrorDetails>(&StaticErrorDetails);\
714 const FError& GetStaticError() \
716 static FError StaticError = MakeError();\
719 bool OfType(const FError& Other) \
721 return UE::UnifiedError::ModuleName::GetStaticModuleId() == Other.GetModuleId() && ErrorCodeId == Other.GetErrorCode(); \
725#define UE_DECLARE_ERROR(DeclareApi, ErrorName, ErrorCode, ModuleName, FormatString) \
726 UE_DECLARE_ERROR_INTERNAL(DeclareApi, ErrorName, ErrorCode, ModuleName, FormatString) \
727 namespace UE::UnifiedError { namespace ModuleName { namespace ErrorName {\
728 inline FError MakeError() { return FError(UE::UnifiedError::ModuleName::GetStaticModuleId(), GetErrorCodeId(), TRefCountPtr<const UE::UnifiedError::FManditoryErrorDetails>(GetStaticErrorDetails().GetReference())); } \
729 template<typename ErrorContextType> \
730 inline FError MakeError(ErrorContextType&& Ctx, EDetailFilter DetailFilter = EDetailFilter::Default) \
732 FError Error(UE::UnifiedError::ModuleName::GetStaticModuleId(), GetErrorCodeId(), TRefCountPtr<const UE::UnifiedError::FManditoryErrorDetails>(GetStaticErrorDetails().GetReference())); \
733 Error.PushErrorContext(MoveTemp(Ctx), DetailFilter); \
739#define UE_DECLARE_ERROR_ONEPARAM(DeclareApi, ErrorName, ErrorCode, ModuleName, FormatString, ParamOneType, ParamOneName, ParamOneDefault) \
740 UE_DECLARE_ERROR_INTERNAL(DeclareApi, ErrorName, ErrorCode, ModuleName, FText::FromString(UTF8TEXT("{"#ModuleName"_F"#ErrorName"}")) ) \
741 namespace UE::UnifiedError { namespace ModuleName { \
742 struct F##ErrorName \
744 ParamOneType ParamOneName;\
747 UE_DECLARE_ERRORSTRUCT_FEATURES(ModuleName, F##ErrorName);\
748 inline void SerializeForLog(FCbWriter& Writer, const UE::UnifiedError::ModuleName::F##ErrorName& Context)\
750 Writer.BeginObject();\
751 Writer.AddString(ANSITEXTVIEW("$type"), TErrorStructFeatures<UE::UnifiedError::ModuleName::F##ErrorName>::GetErrorContextTypeNameAsString());\
752 UE::SerializeLogFormat(Writer, FormatString); \
753 UE::UnifiedError::SerializeBasicToCb(Writer, ANSITEXTVIEW(#ParamOneName), Context.ParamOneName);\
756 namespace UE::UnifiedError { namespace ModuleName { \
757 namespace ErrorName { \
758 inline FError MakeError(ParamOneType ParamOneName = ParamOneDefault) \
760 FError Error = FError(UE::UnifiedError::ModuleName::GetStaticModuleId(), UE::UnifiedError::ModuleName::ErrorName::GetErrorCodeId(), UE::UnifiedError::ModuleName::ErrorName::GetStaticErrorDetails().GetReference()); \
761 F##ErrorName Context = {ParamOneName}; \
762 Error.PushErrorContext(MoveTemp(Context)); \
767#define UE_DECLARE_ERROR_TWOPARAM(DeclareApi, ErrorName, ErrorCode, ModuleName, FormatString, ParamOneType, ParamOneName, ParamOneDefault, ParamTwoType, ParamTwoName, ParamTwoDefault) \
768 UE_DECLARE_ERROR_INTERNAL(DeclareApi, ErrorName, ErrorCode, ModuleName, FText::FromString(UTF8TEXT("{"#ModuleName"_F"#ErrorName"}")) ) \
769 namespace UE::UnifiedError { namespace ModuleName { \
770 struct F##ErrorName \
772 ParamOneType ParamOneName;\
773 ParamTwoType ParamTwoName;\
776 UE_DECLARE_ERRORSTRUCT_FEATURES(ModuleName, F##ErrorName);\
777 inline void SerializeForLog(FCbWriter& Writer, const UE::UnifiedError::ModuleName::F##ErrorName& Context)\
779 Writer.BeginObject();\
780 Writer.AddString(ANSITEXTVIEW("$type"), TErrorStructFeatures<UE::UnifiedError::ModuleName::F##ErrorName>::GetErrorContextTypeNameAsString());\
781 UE::SerializeLogFormat(Writer, FormatString); \
782 UE::UnifiedError::SerializeBasicToCb(Writer, ANSITEXTVIEW(#ParamOneName), Context.ParamOneName);\
783 UE::UnifiedError::SerializeBasicToCb(Writer, ANSITEXTVIEW(#ParamTwoName), Context.ParamTwoName);\
786 namespace UE::UnifiedError { namespace ModuleName { \
787 namespace ErrorName { \
788 inline FError MakeError(ParamOneType ParamOneName = ParamOneDefault, ParamTwoType ParamTwoName = ParamTwoDefault) \
790 FError Error = FError(UE::UnifiedError::ModuleName::GetStaticModuleId(), UE::UnifiedError::ModuleName::ErrorName::GetErrorCodeId(), UE::UnifiedError::ModuleName::ErrorName::GetStaticErrorDetails().GetReference()); \
791 F##ErrorName Context = {ParamOneName, ParamTwoName}; \
792 Error.PushErrorContext(MoveTemp(Context)); \
#define checkf(expr, format,...)
Definition AssertionMacros.h:315
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
constexpr bool EnumHasAnyFlags(Enum Flags, Enum Contains)
Definition EnumClassFlags.h:35
#define ENUM_CLASS_FLAGS(Enum)
Definition EnumClassFlags.h:6
auto GetData(const TStringConversion< Converter, DefaultConversionSize > &Conversion) -> decltype(Conversion.Get())
Definition StringConv.h:802
#define ANSITEXTVIEW(str)
Definition StringView.h:555
#define UTF8TEXTVIEW(str)
Definition StringView.h:557
#define UE_DECLARE_FERROR_DETAILS_ABSTRACT(DetailsNamespace, TypeName)
Definition UnifiedError.h:176
constexpr uint64 CompileTimeHashString(const char *String)
Definition UnifiedError.h:135
CORE_API FString LexToString(const UE::UnifiedError::FError &Error)
Definition UnifiedError.cpp:380
UE_INTRINSIC_CAST UE_REWRITE constexpr std::remove_reference_t< T > && MoveTemp(T &&Obj) noexcept
Definition UnrealTemplate.h:520
Definition CompactBinaryWriter.h:68
void AddInteger(FUtf8StringView Name, int32 Value)
Definition CompactBinaryWriter.h:180
void AddString(FUtf8StringView Name, FUtf8StringView Value)
Definition CompactBinaryWriter.h:173
Definition RefCounting.h:213
uint32 GetRefCount() const
Definition RefCounting.h:231
FReturnedRefCountValue AddRef() const
Definition RefCounting.h:221
uint32 Release() const
Definition RefCounting.h:226
Definition RefCounting.h:196
Definition UnifiedError.h:23
static const FAnsiStringView GetErrorContextTypeNameAsString()
Definition UnifiedError.h:36
static const FAnsiStringView GetErrorDetailsTypeNameAsString()
Definition UnifiedError.h:30
static const FAnsiStringView GetErrorDetailsLogEntryNameAsString()
Definition UnifiedError.h:25
Definition AndroidPlatformMisc.h:14
Definition UnrealString.h.inl:34
Definition RefCounting.h:454
UE_FORCEINLINE_HINT ReferencedType * GetReference() const
Definition RefCounting.h:584
FDynamicErrorDetails; base implementation of inner error details, for use by derived classes to reduc...
Definition UnifiedError.h:319
virtual bool ShouldInclude(const EDetailFilter DetailFilter) const override
Definition UnifiedError.h:339
virtual CORE_API const FText GetErrorFormatString(const FError &Error) const override
GetErrorFormatString; Pass through to the InnerErrorDetails.
Definition UnifiedError.cpp:281
virtual TRefCountPtr< const IErrorDetails > GetInnerErrorDetails() const
GetInnerErrorDetails; Exposes inner error details to FError, if this ErrorDetails allows inner detail...
Definition UnifiedError.h:330
virtual CORE_API ~FDynamicErrorDetails()
Definition UnifiedError.cpp:277
virtual CORE_API void SetInnerErrorDetails(TRefCountPtr< const IErrorDetails > InInnerErrorDetails)
SetInnerErrorDetails; Exposes inner error details to FError, if this ErrorDetails allows inner detail...
Definition UnifiedError.cpp:288
Definition UnifiedError.h:283
static FErrorDetailsRegistry & Get()
Definition UnifiedError.h:289
CORE_API uint32 RegisterDetails(const FAnsiStringView &ErrorDetailsName, TFunction< IErrorDetails *()> CreationFunction)
Definition UnifiedError.cpp:315
Definition UnifiedError.h:424
friend bool operator==(const FError &Error, const FError &OtherError)
Definition UnifiedError.h:538
void Invalidate()
Definition UnifiedError.h:507
FError(FError &&InError)
Definition UnifiedError.h:437
CORE_API FAnsiString GetModuleIdString() const
Definition UnifiedError.cpp:84
CORE_API FText GetErrorMessage(bool bAppendContext=false) const
Definition UnifiedError.cpp:97
~FError()
Definition UnifiedError.h:457
FError(int32 InModuleId, int32 InErrorCode, const FManditoryErrorDetails *InErrorDetails)
Definition UnifiedError.h:430
friend CORE_API void SerializeForLog(FCbWriter &Writer, const FError &Error)
Definition UnifiedError.cpp:234
CORE_API FString SerializeToJsonForAnalytics() const
Definition UnifiedError.cpp:178
CORE_API int32 GetErrorCode() const
Definition UnifiedError.cpp:183
UE_FORCEINLINE_HINT bool IsValid() const
Definition UnifiedError.h:502
void PushErrorContext(T &&InErrorStruct, const EDetailFilter &InDetailFilter=EDetailFilter::Default)
Definition UnifiedError.h:470
CORE_API FAnsiString GetErrorCodeString() const
Definition UnifiedError.cpp:77
CORE_API void AppendFormatString(FText &&InFormatString)
Definition UnifiedError.cpp:227
FError(const FError &InError)
Definition UnifiedError.h:450
const T * GetErrorContext() const
Definition UnifiedError.h:476
CORE_API FAnsiString GetModuleIdAndErrorCodeString() const
GetFullErrorCodeString, Return the combined module id and error code.
Definition UnifiedError.cpp:71
CORE_API int32 GetModuleId() const
Definition UnifiedError.cpp:188
CORE_API FText GetFormatErrorText() const
Definition UnifiedError.cpp:43
FManditoryErrorDetails every FError needs to be initialized with one of these, it contains core infor...
Definition UnifiedError.h:274
virtual FAnsiString GetModuleIdString(const FError &Error) const =0
virtual FAnsiString GetErrorCodeString(const FError &Error) const =0
FRefCountedErrorDetails; base implementation of refcounting for IErrorDetails, this is used for heap ...
Definition UnifiedError.h:303
FStaticErrorDetails; static error details and members are statically allocated Every error which uses...
Definition UnifiedError.h:561
virtual void SerializeToCb(FCbWriter &Writer, const FError &Error) const final
Definition UnifiedError.h:598
virtual CORE_API const FText GetErrorFormatString(const FError &Error) const final
GetErrorFormatString; return the localized format text generated in DECLARE_ERROR macro.
Definition UnifiedError.cpp:299
virtual FReturnedRefCountValue AddRef() const final
Definition UnifiedError.h:612
virtual uint32 Release() const final
Definition UnifiedError.h:613
virtual uint32 GetRefCount() const final
Definition UnifiedError.h:614
virtual CORE_API FAnsiString GetModuleIdString(const FError &Error) const override
GetModuleIdString; accessor for ModuleName. Can be called directly on FStaticErrorDetails object See ...
Definition UnifiedError.cpp:309
virtual bool ShouldInclude(const EDetailFilter Filter) const override
Definition UnifiedError.h:617
virtual ~FStaticErrorDetails()=default
virtual CORE_API FAnsiString GetErrorCodeString(const FError &Error) const override
GetErrorCodeString; Accessor for ErrorName. Can be called directly on FStaticErrorDetails object....
Definition UnifiedError.cpp:304
Definition UnifiedError.h:228
virtual bool ShouldInclude(const EDetailFilter DetailFilter) const
Definition UnifiedError.h:265
virtual TRefCountPtr< const IErrorDetails > GetInnerErrorDetails() const
GetInnerErrorDetails; Exposes inner error details to FError, if this ErrorDetails allows inner detail...
Definition UnifiedError.h:246
virtual uint64 GetErrorDetailsTypeId() const =0
GetErrorDetialsTypeId; Simple type information for error details, generated using hash of details nam...
virtual const FText GetErrorFormatString(const FError &Error) const =0
GetErrorFormatString; specifies the default error format string to be used when generating FError::Ge...
virtual ~IErrorDetails()=default
virtual void SetInnerErrorDetails(TRefCountPtr< const IErrorDetails > ErrorDetails)
SetInnerErrorDetails; Exposes inner error details to FError, if this ErrorDetails allows inner detail...
Definition UnifiedError.h:252
virtual void SerializeToCb(FCbWriter &Writer, const FError &Error) const =0
virtual const FAnsiStringView GetErrorDetailsTypeNameForLog() const =0
virtual const FAnsiStringView GetErrorDetailsTypeName() const =0
Definition UnifiedError.h:346
const FAnsiStringView GetErrorDetailsTypeName() const override
Definition UnifiedError.h:389
static FAnsiStringView StaticGetErrorDetailsTypeName()
Definition UnifiedError.h:385
const FAnsiStringView GetErrorDetailsTypeNameForLog() const override
Definition UnifiedError.h:394
virtual bool ShouldInclude(const EDetailFilter InDetailFilter) const override
Definition UnifiedError.h:399
const T & GetValue() const
Definition UnifiedError.h:416
TErrorDetails()
Definition UnifiedError.h:348
friend IErrorDetails * Create()
Definition NavigationSystemTypes.h:162
virtual void SerializeToCb(FCbWriter &Writer, const FError &Error) const override
Definition UnifiedError.h:411
const T & GetErrorContext() const
Definition UnifiedError.h:406
virtual uint64 GetErrorDetailsTypeId() const
GetErrorDetialsTypeId; Simple type information for error details, generated using hash of details nam...
Definition UnifiedError.h:369
static IErrorDetails * Create()
Definition UnifiedError.h:360
static uint64 StaticGetErrorDetailsTypeId()
Definition UnifiedError.h:365
TErrorDetails(T &&InErrorDetail, const EDetailFilter InDetailFilterMask=EDetailFilter::Default)
Definition UnifiedError.h:349
CORE_API int32 RegisterErrorCode(const FAnsiStringView ErrorName, int32 ModuleId, int32 ErrorCode)
Definition UnifiedError.cpp:367
CORE_API uint32 RegisterModule(const FAnsiStringView ModuleName)
Definition UnifiedError.cpp:361
Definition IoStatusError.cpp:13
void SerializeForLog(FCbWriter &Writer, const FError &Error)
Definition UnifiedError.cpp:234
void SerializeBasicToCb(FCbWriter &Writer, const FUtf8StringView &PropertyName, const FStringView &Value)
Definition UnifiedError.h:621
EDetailFilter
Definition UnifiedError.h:202
@ IncludeInContextLogMessage
Definition RefCounting.h:29
Definition UnifiedError.h:68
constexpr TStringLiteralWithColonsReplaced(const char(&InStr)[N])
Definition UnifiedError.h:69
char Str[N]
Definition UnifiedError.h:97
Definition UnifiedError.h:103
constexpr TStringLiteralWithSpacesReplaced(const char(&InStr)[N])
Definition UnifiedError.h:104
char Str[N]
Definition UnifiedError.h:132
Definition UnifiedError.h:18