오류 값 되돌리기
오류 값 되돌리기 (@errorFromInt)
에러는 내부적으로 정수로 표현되는데, 그 정수 표현에서 다시 에러 값으로 되돌리는 내장 함수가 @errorFromInt예요. 에러가 어떤 모양으로 담기는지 궁금할 때, 그리고 이 변환을 막 쓰면 안 되는 이유가 뭔지 함께 살펴볼게요. 개념 자체는 짧지만 에러의 정수 표현이라는 좀 미묘한 부분을 다루는 함수라서 조심스럽게 접근하는 게 좋아요.
본문
@errorFromInt는 에러의 정수 표현(integer representation)을 The Global Error Set(전역 에러 셋) 타입의 실제 에러 값으로 바꿔 주는 함수예요.
@errorFromInt(value: @Int(.unsigned, @bitSizeOf(anyerror))) anyerror
이 캐스트(cast)는 되도록 피하는 게 좋아요. 이유가 중요한데, 에러의 정수 표현은 소스 코드가 바뀌면 그대로 유지된다는 보장이 없기 때문이에요. 즉 지금은 특정 숫자가 어떤 에러를 가리키더라도 코드를 고치면 그 대응 관계가 뒤바뀔 수 있어서, 이 함수로 만든 값을 오래 보관하거나 외부에 저장해 두는 건 위험해요. 에러를 숫자로 굳이 바꿔서 다뤄야 한다면 그 불안정성부터 꼭 염두에 두어야 해요.
게다가 어떤 에러에도 해당하지 않는 정수를 넣어 변환을 시도하면, 안전 검사(safety-checked)를 거치는 Illegal Behavior(잘못된 동작)가 일어나요. 그러니까 값이 실제 에러에 대응되는지 확신하지 못하는 상황에서 섣불리 쓰면 실행 중에 문제가 드러나는 거죠.
참고
- @intFromError — 반대 방향으로, 에러 값을 정수 표현으로 바꾸는 함수예요.
@errorFromInt와 정확히 짝을 이루는 내장 함수라서 함께 기억해 두면 좋아요.
더 알아보기
- The Global Error Set —
anyerror가 가리키는 전역 에러 셋이 어떤 식으로 구성되는지 여기서 이어서 확인해 볼 수 있어요. - Illegal Behavior — 안전 검사가 걸리는 잘못된 동작이 구체적으로 무엇인지, 어떤 방식으로 검출되는지 정리돼 있어요.