try / catch 의 설명과 언리얼에서 사용하지않는 이유를 적절한 예시를 통해 쉽게 이해시켜줌
https://bbagwang.com/programming/cpp/c-exception-pros-cons/
C++ Exception Pros & Cons – BBAGWANG
우리가 만드는 게임과 프로그램들이 항상 문제없이 잘만돌아가면 좋겠지만 현실은 다양한 문제들이 발견되거나 내재되어있다. 이러한 문제들은 개발자가 의도한 정상적인 실행 로직의 범주에
bbagwang.com
C++ 에서 예외를 던지는 throw는 try구문 안에 있어야 하며, throw 발생 시 예외를 받아주는 catch구문으로 점프하게된다.
catch로 점프를 하기 위해서 catch를 찾아야 하는데 외부의 catch를 찾기 위해 현재의 스택정보를 정리하고 빠져나가는 스택 되감기(Stack Unwinding)가 발생하게 된다.
이 작업은 한 번만 일어나지 않을 수 있다. 에러와 대응하거나 범주에 속하는 catch를 찾을 때 까지 스택을 되감아 올라간다.
그렇기 때문에 이후에 진행되어야 할 작업들이 모두 강제로 취소되어버리게된다.
또한 스택 되감기를 위한 비용이 많이 들어간다
throw가 한 번도 발생하지 않을 경우 퍼포먼스적인 타격은 아예 없지만 예외처리를 하면서 예외 타입에 따른 캐스팅과 스택 되감기가 일어나면서 퍼포먼스를 많이 저하시킨다.
게임 퍼포먼스가 중요한 언리얼 엔진에서는 예외처리 방식을 거의 사용하지 않고, 사용할 수 없도록 강제한다.
언리얼은 대신 Assert 를 이용할 수 있는 매크로와 시스템을 제공한다.
어서트란 주어진 코드 조각이 가정하는 상황을 검증하는 도구이며
항상 참이라고 가정하는 조건부 문장으로 어서션이 실패하였다는 건 프로그래머가 잘 못했다는 뜻 이다.
ex)
const UWorld* World = GetWorld();
check(World);
어서트 실패는 시스템의 다른 부분에서는 절대 검사하지않아야하며, 어서트가 있고 없고가 프로그램 기능의 정상 동작에 아무런 영향을 주지 않도록 작성되어야 한다
매크로는 Engine/Source/Runtime/Core/Public/Misc/AssertionMacros.h 파일에서 확인할 수 있다.
DEBUG | DEVELOPMENT | TEST | SHIPPING | SHIPPING EDITOR | |
DO_GUARD_SLOW | 1 | 0 | 0 | 0 | 0 |
DO_CHECK | 1 | 1 | 0 | 0 | 1 |
DO_ENSURE | 1 | 1 | 0 | 0 | 1 |
#define USE_CHECKS_IN_SHIPPING 0
#define USE_ENSURES_IN_SHIPPING USE_CHECKS_IN_SHIPPING
#if UE_BUILD_DEBUG
#define DO_GUARD_SLOW 1
#define DO_CHECK 1
#define DO_ENSURE 1
#elif UE_BUILD_DEVELOPMENT
#define DO_GUARD_SLOW 0
#define DO_CHECK 1
#define DO_ENSURE 1
#elif UE_BUILD_TEST
#define DO_GUARD_SLOW 0
#define DO_CHECK USE_CHECKS_IN_SHIPPING
#define DO_ENSURE USE_ENSURES_IN_SHIPPING
#elif UE_BUILD_SHIPPING
#if WITH_EDITOR
#define DO_GUARD_SLOW 0
#define DO_CHECK 1
#define DO_ENSURE 1
#else
#define DO_GUARD_SLOW 0
#define DO_CHECK USE_CHECKS_IN_SHIPPING
#define DO_ENSURE USE_ENSURES_IN_SHIPPING
#endif
#endif
check / vertify
표현식의 결과가 false 일 경우 게임 실행 중지 (Editor 중단 트리거)

check(IsInGameThread())
verify(IsInGameThread())
vertify - check 와 같지만 DO_CHECK 가 0으로 되어있어도 실행됨
checkf / verifyf
check와 동일하지만 추가 매개변수로 printf도 같이 할 수 있음 (false 일 경우에만)

verifyf - checkf 와 같지만 DO_CHECK 가 0으로 되어있어도 실행됨