8. 에러 처리: '달빛 약속'의 견고함
프로그래밍 언어에서 에러 처리는 코드의 안정성과 사용자 경험에 직결되는 매우 중요한 부분입니다. '달빛 약속' 역시 코드 실행 중 발생할 수 있는 다양한 오류 상황을 체계적으로 관리하고 사용자에게 명확하게 전달하기 위한 자체적인 에러 처리 시스템을 갖추고 있습니다. 이번 장에서는 '달빛 약속'의 에러 처리 메커니즘을 살펴보겠습니다.
'달빛 약속' 에러의 기본: YaksokError
'달빛 약속'에서 발생하는 모든 에러는 /core/error/common.ts
에 정의된 YaksokError
클래스를 상속받습니다. YaksokError
는 다음과 같은 공통적인 정보를 포함합니다.
code
: 에러를 식별하는 고유한 코드 (예:NOT_DEFINED_IDENTIFIER
)message
: 사용자에게 보여줄 에러 메시지resource
: 에러 발생과 관련된 추가 정보 (예: 정의되지 않은 식별자의 이름)codeFile
: 에러가 발생한CodeFile
인스턴스에 대한 참조tokens
: 에러가 발생한 코드 위치를 특정할 수 있는 토큰 정보
이러한 구조를 통해 '달빛 약속'은 에러 발생 시 단순히 메시지만 보여주는 것이 아니라, 어떤 종류의 에러인지, 어디서 발생했는지, 그리고 무엇이 문제인지에 대한 상세한 정보를 제공할 수 있습니다.
에러의 종류와 분류
core/error
디렉터리 아래에는 다양한 종류의 에러들이 목적에 따라 분류되어 정의되어 있습니다. 예를 들어:
/core/error/function.ts
: 함수와 관련된 에러 (예:AlreadyDefinedFunctionError
)/core/error/validation.ts
: 코드 유효성 검사 중 발생하는 에러/core/error/indexed.ts
: 목록(List) 접근과 관련된 에러 (예:IndexOutOfRangeError
)
특히 /core/error/validation.ts
에 정의된 ErrorGroups
클래스는 여러 파일에서 동시에 발생한 유효성 검사 에러들을 그룹화하여 한 번에 처리할 수 있도록 돕습니다. 이는 YaksokSession
의 validate()
메소드에서 활용됩니다.
에러 메시지 렌더링 및 컨벤션
사용자에게 에러를 친절하고 명확하게 보여주는 것은 매우 중요합니다. '달빛 약속'은 /core/error/render-error-string.ts
에 정의된 renderErrorString
함수를 사용하여 YaksokError
인스턴스를 읽기 쉬운 문자열 형태로 변환합니다.
이 함수는 에러 메시지뿐만 아니라, 에러가 발생한 코드의 위치(줄 번호, 컬럼)와 해당 코드 스니펫까지 함께 보여주어 사용자가 문제를 쉽게 파악하고 해결할 수 있도록 돕습니다.
특히, renderErrorString
함수는 **ANSI 터미널 문자(ANSI Escape Codes)**를 사용하여 에러 메시지에 색상과 스타일을 적용합니다. 이는 터미널 환경에서 에러 메시지의 가독성을 크게 높여줍니다.
에러의 전파와 처리
'달빛 약속'의 에러는 JavaScript/TypeScript의 예외(Exception) 메커니즘과 유사하게 동작합니다. 에러가 발생하면 현재 실행 흐름이 중단되고, 가장 가까운 try...catch
블록으로 전파됩니다.
YaksokSession
의 runModule
메소드는 코드 실행 중 발생하는 모든 YaksokError
를 catch
하여 사용자에게 적절한 방식으로 (stderr
를 통해) 출력하고, 실행 결과를 담은 RunModuleResult
객체에 에러 정보를 포함하여 반환합니다.
또한, Executer
에서 설명했던 ReturnSignal
이나 BreakSignal
과 같은 특별한 시그널들도 내부적으로는 예외처럼 동작하며, executer
함수에서 이를 캐치하여 CannotReturnOutsideFunctionError
나 BreakNotInLoopError
와 같은 YaksokError
로 변환하여 처리됩니다.