assert는 C에서 생겨 개발 중 예상치 못한 런타임 조건을 탐지하고 진단하는 데 유용하다.
예를 들어, 포인터가 null이 아닌지, 제수가 0이 아닌지, 함수가 반복적으로 실행되지 않는지 등을 확인하여 중요한 가정이 맞는지 점검한다.
언리얼 엔진에서는 assert와 유사한 3가지 방법을 제공한다.
이들은 모두 개발 중에 조건을 확인하고, 조건이 맞지 않으면 오류를 발생시키는 역할을 한다.
이 셋은 모두 기본적으론 Release Packege에선 작동을 안함.
check는 표현식이 false로 평가되면 실행을 멈춘다.
check 매크로는 디버그, 개발, 테스트, 릴리즈 에디터 빌드에서 작동하며, slow로 끝나는 매크로는 디버그 빌드에서만 작동한다.
USE_CHECKS_IN_SHIPPING을 true로 설정하면 모든 빌드에서 작동한다.
check는 코드 내에서 값 변경이나 추적이 어려운 릴리즈 전용 버그를 확인할 때 유용하다.
ensure의 표현식이 false로 평가되면 크래시 리포터에 알리지만 실행은 계속된다.
ensure 계열은 verify와 비슷하지만, 치명적이지 않은 오류를 처리하는 데 사용된다.
크래시 리포터 플러드를 방지하기 위해 한 세션당 한 번만 보고된다.
ensure는 모든 빌드에서 표현식을 평가하지만, 디버그, 개발, 테스트, 릴리즈 에디터 빌드에서만 크래시 리포터에 알린다.
always 버전을 사용하면 매번 리포트를 받을 수 있다.
기본적으론 1회용 로그만 남기는 check라 보면 될 듯
ensureAlways를 쓰면 오류가 터질 때 마다 로그를 남겨줄 수 있음
verify는 항상 표현식을 평가한다. 표현식이 항상 실행되어야 할 경우에 사용해야한다.
verify는 check와 비슷하지만, check가 비활성화된 빌드에서도 표현식을 평가한다.
verify는 디버그, 개발, 테스트, 릴리즈 에디터 빌드에서 작동하며, slow 매크로는 디버그 빌드에서만 작동한다.
USE_CHECKS_IN_SHIPPING을 true로 설정하면 모든 빌드에서 작동한다.
verify는 표현식을 평가하지만 실행을 멈추거나 로그를 출력하지 않는다.
많이 안쓴다.
항상 표현식을 평가한다는게 이해가 잘 안될 수 있는데 아래와 같은 상황에 쓰인다.
ex)
// 메시 값을 설정하고 그 값이 null이 아닐 것으로 예상합니다.
// 그 후 메시가 null이면 프로그램을 정지합니다.
// 표현식에 추가 이펙트(메시 세팅)가 있으므로 Check 대신 Verify를 사용합니다.
verify((Mesh = GetRenderMesh()) != nullptr);
//이게 Shipping 빌드에서는 아래처럼 바뀐다.
Mesh = GetRenderMesh();
더 자세한건 아래의 언리얼 어서트 설명을 보는게 좋다.
https://dev.epicgames.com/documentation/ko-kr/unreal-engine/asserts-in-unreal-engine