UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
UnifiedError.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2#pragma once
3
4#include "CoreTypes.h"
11#include "Misc/TVariant.h"
13
14
15#include <type_traits>
16
17template<typename>
18struct deferred_false : std::false_type {};
19
20
21template<typename T>
23{
24public:
26 {
27 static_assert(deferred_false<T>::value, "All types are required to define DECLARE_ERRORSTRUCT_FEATURES to be used as a error context type");
28 return ANSITEXTVIEW("");
29 }
31 {
32 static_assert(deferred_false<T>::value, "All types are required to define DECLARE_ERRORSTRUCT_FEATURES to be used as a error context type");
33 return ANSITEXTVIEW("");
34 }
35
37 {
38 static_assert(deferred_false<T>::value, "All types are required to define DECLARE_ERRORSTRUCT_FEATURES to be used as a error context type");
39 return ANSITEXTVIEW("");
40 }
41};
42
43
44
45#define UE_DECLARE_ERRORSTRUCT_FEATURES(DetailsNameSpace, DetailsStructName)\
46 template<>\
47 class TErrorStructFeatures<UE::UnifiedError::DetailsNameSpace::DetailsStructName>\
48 {\
49 public:\
50 static const FAnsiStringView GetErrorDetailsLogEntryNameAsString() \
51 {\
52 return ANSITEXTVIEW(#DetailsNameSpace"_"#DetailsStructName);\
53 }\
54 static const FAnsiStringView GetErrorDetailsTypeNameAsString() \
55 {\
56 return ANSITEXTVIEW("TErrorDetails<"#DetailsNameSpace"::"#DetailsStructName">");\
57 }\
58 static const FAnsiStringView GetErrorContextTypeNameAsString() \
59 {\
60 return ANSITEXTVIEW(#DetailsNameSpace"::"#DetailsStructName);\
61 }\
62 };
63
64
65
66template <unsigned int N>
68{
69 constexpr TStringLiteralWithColonsReplaced(const char(&InStr)[N])
70 {
71 int OutIndex = 0;
72 int i = 0;
73 for (; i < N; ++i)
74 {
75 if (InStr[i] == '\0')
76 {
77 Str[OutIndex] = InStr[i];
78 break;
79 }
80 else if (InStr[i] == ':' && InStr[i + 1] == ':')
81 {
82 Str[OutIndex] = '_';
83 ++OutIndex;
84 }
85 else if (InStr[i] != ':')
86 {
87 Str[OutIndex] = InStr[i];
88 ++OutIndex;
89 }
90 }
91 for (; OutIndex < N; ++OutIndex)
92 {
93 Str[OutIndex] = '\0';
94 }
95 }
96
97 char Str[N];
98};
99
100
101template <unsigned int N>
103{
104 constexpr TStringLiteralWithSpacesReplaced(const char(&InStr)[N])
105 {
106 int OutIndex = 0;
107 int i = 0;
108 for (; i < N; ++i)
109 {
110 if (InStr[i] == '\0')
111 {
112 Str[OutIndex] = InStr[i];
113 break;
114 }
115 else if (InStr[i] == ' ')
116 {
117 Str[OutIndex] = '_';
118 ++OutIndex;
119 }
120 else
121 {
122 Str[OutIndex] = InStr[i];
123 ++OutIndex;
124 }
125 }
126 for (; OutIndex < N; ++OutIndex)
127 {
128 Str[OutIndex] = '\0';
129 }
130 }
131
132 char Str[N];
133};
134
135constexpr uint64 CompileTimeHashString(const char* String)
136{
137 // Based on djb2
138 uint64 Result = 5381;
139 while (char Ch = *String++)
140 {
141 Result = ((Result << 5) + Result) + Ch;
142 }
143 return Result;
144}
145
146// TODO Daniel: StaticDetailsTypeId is intended to register the creation functions with the FErrorDetailsRegistry for support of serialization / deserialization of error details
147
148#define UE_DECLARE_ERROR_DETAILS_INTERNAL(DetailsNamespace, TypeName)\
149 inline static constexpr FAnsiStringView StaticGetErrorDetailsTypeName() \
150 {\
151 return #DetailsNamespace"::"#TypeName;\
152 }\
153 virtual const FAnsiStringView GetErrorDetailsTypeName() const override \
154 {\
155 return StaticGetErrorDetailsTypeName();\
156 }\
157 inline static FAnsiStringView StaticGetErrorDetailsTypeNameForLog() \
158 {\
159 static auto Replaced = TStringLiteralWithColonsReplaced(#DetailsNamespace"_"#TypeName);\
160 return Replaced.Str;\
161 }\
162 virtual const FAnsiStringView GetErrorDetailsTypeNameForLog() const override\
163 {\
164 return StaticGetErrorDetailsTypeNameForLog(); \
165 }\
166 virtual uint64 GetErrorDetailsTypeId() const \
167 { \
168 return StaticGetErrorDetailsTypeId(); \
169 }\
170 static uint64 StaticGetErrorDetailsTypeId() \
171 { \
172 return CompileTimeHashString(StaticGetErrorDetailsTypeName().GetData()); \
173 }
174
175
176#define UE_DECLARE_FERROR_DETAILS_ABSTRACT(DetailsNamespace, TypeName)\
177 public:\
178 UE_DECLARE_ERROR_DETAILS_INTERNAL(DetailsNamespace, TypeName);
179
180 // inline const uint32 StaticDetailsTypeId = UE::UnifiedError::FErrorDetailsRegistry::Get().RegisterDetails(StaticGetErrorDetailsTypeName(), nullptr);
181
182
183
184#define UE_DECLARE_FERROR_DETAILS(DetailsNamespace, TypeName)\
185 public:\
186 UE_DECLARE_ERROR_DETAILS_INTERNAL(DetailsNamespace, TypeName);\
187 friend IErrorDetails* Create();\
188 inline static IErrorDetails* Create()\
189 {\
190 return new TypeName();\
191 }
192
193 // inline const uint32 StaticDetailsTypeId = UE::UnifiedError::FErrorDetailsRegistry::Get().RegisterDetails(StaticGetErrorDetailsTypeName(), TFunction<IErrorDetails* ()>([]() -> IErrorDetails* { return TypeName::Create(); }));
194
195
196
197
198namespace UE::UnifiedError
199{
200
201 enum class EDetailFilter : uint8
202 {
203 IncludeInSerialize = 1 << 0, // included when we serialize the details objects, almost every details should have this flag
204 IncludeInAnalytics = 1 << 1, // what details objects to include when we are creating events for analytics
205 IncludeInContextLogMessage = 1 << 2, // what details objects are included when the log message includes context objects on the string
206 IncludeInLogMessage = 1 << 3, // which details objects are included when we log a message without context objects included
207 // append here
208
209
210 // standard values
212 None = 0x00,
213 All = 0xff
214 };
216
217 namespace ErrorRegistry
218 {
220
221 CORE_API int32 RegisterErrorCode(const FAnsiStringView ErrorName, int32 ModuleId, int32 ErrorCode);
222 }
223
224
225 class FError;
226
228 {
229 public:
230 virtual ~IErrorDetails() = default;
231
239 virtual const FText GetErrorFormatString(const FError& Error) const = 0;
240
241
246 virtual TRefCountPtr<const IErrorDetails> GetInnerErrorDetails() const { return nullptr; }
247
252 virtual void SetInnerErrorDetails(TRefCountPtr<const IErrorDetails> ErrorDetails) { checkf(false, TEXT("SetInnerErrorDetails not implemented!")); }
253
259 virtual uint64 GetErrorDetailsTypeId() const = 0;
260
261 virtual const FAnsiStringView GetErrorDetailsTypeName() const = 0;
263 virtual void SerializeToCb(FCbWriter& Writer, const FError& Error) const =0;
264
266 };
267
268
274 {
276 private:
277 public:
278 virtual FAnsiString GetErrorCodeString(const FError& Error) const = 0;
279 virtual FAnsiString GetModuleIdString(const FError& Error) const = 0;
280 };
281
283 {
284 private:
285 TMap<uint32, TFunction<IErrorDetails* ()>> CreateFunctions;
286
288 public:
290 {
292 return Registry;
293 }
294
296 };
297
298
303 {
305
306
308
309 virtual FReturnedRefCountValue AddRef() const final { return FRefCountBase::AddRef(); }
310 virtual uint32 Release() const final { return FRefCountBase::Release(); }
311 virtual uint32 GetRefCount() const final { return FRefCountBase::GetRefCount(); }
312 };
313
314
319 {
321 private:
322 TRefCountPtr<const IErrorDetails> InnerErrorDetails;
323 public:
326
327
328 // IErrorDetails functions
330 virtual TRefCountPtr<const IErrorDetails> GetInnerErrorDetails() const { return InnerErrorDetails; }
331
337 CORE_API virtual const FText GetErrorFormatString(const FError& Error) const override;
338
340 };
341
342 CORE_API void SerializeForLog(FCbWriter& Writer, const class FError& Error);
343
344 template<typename T>
346 {
347 public:
354 /*TErrorDetails(T&& InErrorDetail, TRefCountPtr<const IErrorDetails> InInnerErrorDetails) : FDynamicErrorDetails(InInnerErrorDetails)
355 {
356 ErrorDetail = MoveTemp(InErrorDetail);
357 }*/
358
359 friend IErrorDetails* Create();
360 inline static IErrorDetails* Create()
361 {
362 return new TErrorDetails<T>();
363 }
364
370 {
372 }
373
374 /*inline static const uint32 StaticDetailsTypeId = UE::UnifiedError::FErrorDetailsRegistry::Get().RegisterDetails(TErrorStructFeatures<T>::GetErrorDetailsTypeNameAsString(), TFunction<IErrorDetails * ()>([]() -> IErrorDetails* { return Create(); }));
375 static uint32 StaticGetErrorDetailsTypeId()
376 {
377 return StaticDetailsTypeId;
378 }
379 virtual uint32 GetErrorDetailsTypeId() const
380 {
381 return StaticGetErrorDetailsTypeId();
382 }*/
383
384
393
398
399 virtual bool ShouldInclude(const EDetailFilter InDetailFilter) const override { return EnumHasAnyFlags(InDetailFilter, DetailFilterMask); }
400
401 private:
402 T ErrorDetail;
403 EDetailFilter DetailFilterMask = EDetailFilter::Default;
404
405 public:
406 const T& GetErrorContext() const
407 {
408 return ErrorDetail;
409 }
410
411 virtual void SerializeToCb(FCbWriter& Writer, const FError& Error) const override
412 {
413 SerializeForLog(Writer, ErrorDetail);
414 }
415
416 const T& GetValue() const
417 {
418 return ErrorDetail;
419 }
420
421 };
422
423 class FError
424 {
425 private:
426 int32 ErrorCode;
427 int32 ModuleId;
429 public:
431 {
432 ErrorCode = InErrorCode;
433 ModuleId = InModuleId;
434 ErrorDetails = InErrorDetails;
435 }
436 public:
438 {
439 ErrorCode = InError.ErrorCode;
440 InError.ErrorCode = 0;
441 ModuleId = InError.ModuleId;
442 InError.ModuleId = 0;
443 if (InError.ErrorDetails)
444 {
445 ErrorDetails = InError.ErrorDetails;
446 InError.ErrorDetails = nullptr;
447 }
448 }
449
451 {
452 ErrorCode = InError.ErrorCode;
453 ModuleId = InError.ModuleId;
454 ErrorDetails = InError.ErrorDetails;
455 }
456
458 {
459 Invalidate();
460 }
461
462
464 CORE_API int32 GetModuleId() const;
465
466 CORE_API FText GetErrorMessage(bool bAppendContext = false) const;
468
469 template<typename T>
474
475 template<typename T>
476 const T* GetErrorContext() const
477 {
478
480 if (const TErrorDetails<T>* Details = CurrentDetails.GetReference())
481 {
482 return &Details->GetErrorContext();
483 }
484 return nullptr;
485
486 }
487
490
491
497
499
501
503 {
504 return (ErrorCode != 0) && (ModuleId != 0);
505 }
506
507 inline void Invalidate()
508 {
509 ErrorCode = 0;
510 ModuleId = 0;
511 ErrorDetails = nullptr;
512 }
513 private:
514
515 friend CORE_API void SerializeForLog(FCbWriter& Writer, const FError& Error);
516
517 void SerializeDetails(FCbWriter& Writer, const EDetailFilter DetailFilter, bool bIncludeRoot = true) const;
518 FString SerializeToJsonString(const EDetailFilter DetailFilter) const;
519
520 const FManditoryErrorDetails* GetManditoryErrorDetails() const;
521
523 template<typename DetailType>
524 TRefCountPtr<const DetailType> GetErrorDetails() const
525 {
526 TRefCountPtr<const IErrorDetails> CurrentIt = ErrorDetails;
527 while (CurrentIt != nullptr)
528 {
529 if (CurrentIt->GetErrorDetailsTypeId() == DetailType::StaticGetErrorDetailsTypeId())
530 {
531 return TRefCountPtr<const DetailType>((const DetailType*)CurrentIt.GetReference());
532 }
533 CurrentIt = CurrentIt->GetInnerErrorDetails();
534 }
535 return nullptr;
536 }
537
538 friend bool operator==(const FError& Error, const FError& OtherError)
539 {
540 if ((Error.ModuleId == OtherError.ModuleId) &&
541 (Error.ErrorCode == OtherError.ErrorCode))
542 {
543 return true;
544 }
545 return false;
546 }
547
548 TRefCountPtr<const IErrorDetails> GetInnerMostErrorDetails() const;
549 };
550
551
552
553
561 {
563 private:
564 const FAnsiStringView ErrorName;
565 const FAnsiStringView ModuleName;
566 FText ErrorFormatString;
567 public:
568 // TODO: convert AnsiStringView to UTF8StringView when c++ 20 is supported
570
571 virtual ~FStaticErrorDetails() = default;
572
579 CORE_API virtual FAnsiString GetErrorCodeString(const FError& Error) const override;
580
581
587 CORE_API virtual FAnsiString GetModuleIdString(const FError& Error) const override;
588
589 // IErrorDetails implementation
590
596 CORE_API virtual const FText GetErrorFormatString(const FError& Error) const final;
597
598 virtual void SerializeToCb(FCbWriter& Writer, const FError& Error) const final
599 {
600 Writer.BeginObject();
601 Writer.AddString(UTF8TEXTVIEW("$format"), UTF8TEXTVIEW("({ModuleIdString}.{ErrorCodeString})"));
602 Writer.AddString(UTF8TEXTVIEW("$type"), UTF8TEXTVIEW("FStaticErrorDetails"));
603 Writer.AddString(UTF8TEXTVIEW("ErrorCodeString"), ErrorName);
604 Writer.AddString(UTF8TEXTVIEW("ModuleIdString"), ModuleName);
605 Writer.AddInteger(UTF8TEXTVIEW("ErrorCode"), Error.GetErrorCode());
606 Writer.AddInteger(UTF8TEXTVIEW("ModuleId"), Error.GetModuleId());
607 Writer.EndObject();
608 }
609
610 // IRefCountedObject implementation
611 // FStaticErrorDetails is statically allocated, make sure it is never released.
612 virtual FReturnedRefCountValue AddRef() const final { return FReturnedRefCountValue(10); }
613 virtual uint32 Release() const final { return 10; }
614 virtual uint32 GetRefCount() const final { return 10; }
615
616
617 virtual bool ShouldInclude(const EDetailFilter Filter) const override { return EnumHasAnyFlags(Filter, EDetailFilter::Default); }
618 };
619
620
622 {
624 }
626 {
628 }
630 {
632 }
634 {
636 }
638 {
640 }
642 {
644 }
646 {
647 Writer.AddString(PropertyName, Value.ToString());
648 }
649
650
651
652} // namespace UnifiedError
653
654
655
657/*
658
659CORE_API constexpr uint32 GetTypeIdHash(const TCHAR* TypeName)
660{
661 return FCrc::StrCrc32(GetData(S));
662}
663*/
664
665
666#define UE_DECLARE_ERROR_MODULE(DeclareApi, ModuleName) \
667 namespace UE::UnifiedError { namespace ModuleName {\
668 DeclareApi FAnsiStringView GetStaticModuleName(); \
669 DeclareApi int32 GetStaticModuleId(); \
670 }}
671
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() \
677 { \
678 static const auto Reference = TStringLiteralWithSpacesReplaced(#ModuleName); \
679 return Reference.Str; \
680 }\
681 }}
682
683
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; } \
694 }}}
695
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() \
701 {\
702 return ErrorCodeId;\
703 }\
704 FAnsiStringView GetStaticErrorName() \
705 { \
706 static const auto Reference = TStringLiteralWithSpacesReplaced(#ErrorName); \
707 return Reference.Str; \
708 }\
709 TRefCountPtr<const FStaticErrorDetails> GetStaticErrorDetails() \
710 {\
711 static FStaticErrorDetails StaticErrorDetails(GetStaticErrorName(), UE::UnifiedError::ModuleName::GetStaticModuleName(), DeclaredFormatString);\
712 return TRefCountPtr<const FStaticErrorDetails>(&StaticErrorDetails);\
713 }\
714 const FError& GetStaticError() \
715 {\
716 static FError StaticError = MakeError();\
717 return StaticError;\
718 }\
719 bool OfType(const FError& Other) \
720 {\
721 return UE::UnifiedError::ModuleName::GetStaticModuleId() == Other.GetModuleId() && ErrorCodeId == Other.GetErrorCode(); \
722 }\
723 }}}
724
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) \
731 {\
732 FError Error(UE::UnifiedError::ModuleName::GetStaticModuleId(), GetErrorCodeId(), TRefCountPtr<const UE::UnifiedError::FManditoryErrorDetails>(GetStaticErrorDetails().GetReference())); \
733 Error.PushErrorContext(MoveTemp(Ctx), DetailFilter); \
734 return Error; \
735 }\
736 }}}
737
738
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 \
743 {\
744 ParamOneType ParamOneName;\
745 };\
746 }}\
747 UE_DECLARE_ERRORSTRUCT_FEATURES(ModuleName, F##ErrorName);\
748 inline void SerializeForLog(FCbWriter& Writer, const UE::UnifiedError::ModuleName::F##ErrorName& Context)\
749 {\
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);\
754 Writer.EndObject();\
755 }\
756 namespace UE::UnifiedError { namespace ModuleName { \
757 namespace ErrorName { \
758 inline FError MakeError(ParamOneType ParamOneName = ParamOneDefault) \
759 { \
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)); \
763 return Error; \
764 } \
765 }}}
766
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 \
771 {\
772 ParamOneType ParamOneName;\
773 ParamTwoType ParamTwoName;\
774 };\
775 }}\
776 UE_DECLARE_ERRORSTRUCT_FEATURES(ModuleName, F##ErrorName);\
777 inline void SerializeForLog(FCbWriter& Writer, const UE::UnifiedError::ModuleName::F##ErrorName& Context)\
778 {\
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);\
784 Writer.EndObject();\
785 }\
786 namespace UE::UnifiedError { namespace ModuleName { \
787 namespace ErrorName { \
788 inline FError MakeError(ParamOneType ParamOneName = ParamOneDefault, ParamTwoType ParamTwoName = ParamTwoDefault) \
789 { \
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)); \
793 return Error; \
794 } \
795 }}}
796
#define checkf(expr, format,...)
Definition AssertionMacros.h:315
#define TEXT(x)
Definition Platform.h:1272
FPlatformTypes::int64 int64
A 64-bit signed integer.
Definition Platform.h:1127
FPlatformTypes::int32 int32
A 32-bit signed integer.
Definition Platform.h:1125
#define UE_FORCEINLINE_HINT
Definition Platform.h:723
FPlatformTypes::uint64 uint64
A 64-bit unsigned integer.
Definition Platform.h:1117
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
uint8_t uint8
Definition binka_ue_file_header.h:8
uint32_t uint32
Definition binka_ue_file_header.h:6
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 Text.h:385
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 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
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