Skip to content

8. 에러 처리: '달빛 약속'의 견고함

프로그래밍 언어에서 에러 처리는 코드의 안정성과 사용자 경험에 직결되는 매우 중요한 부분입니다. '달빛 약속' 역시 코드 실행 중 발생할 수 있는 다양한 오류 상황을 체계적으로 관리하고 사용자에게 명확하게 전달하기 위한 자체적인 에러 처리 시스템을 갖추고 있습니다. 이번 장에서는 '달빛 약속'의 에러 처리 메커니즘을 살펴보겠습니다.

'달빛 약속' 에러의 기본: YaksokError

'달빛 약속'에서 발생하는 모든 에러는 /core/error/common.ts에 정의된 YaksokError 클래스를 상속받습니다. YaksokError는 다음과 같은 공통적인 정보를 포함합니다.

  • code: 에러를 식별하는 고유한 코드 (예: NOT_DEFINED_IDENTIFIER)
  • message: 사용자에게 보여줄 에러 메시지
  • resource: 에러 발생과 관련된 추가 정보 (예: 정의되지 않은 식별자의 이름)
  • codeFile: 에러가 발생한 CodeFile 인스턴스에 대한 참조
  • tokens: 에러가 발생한 코드 위치를 특정할 수 있는 토큰 정보

이러한 구조를 통해 '달빛 약속'은 에러 발생 시 단순히 메시지만 보여주는 것이 아니라, 어떤 종류의 에러인지, 어디서 발생했는지, 그리고 무엇이 문제인지에 대한 상세한 정보를 제공할 수 있습니다.

에러의 종류와 분류

core/error 디렉터리 아래에는 다양한 종류의 에러들이 목적에 따라 분류되어 정의되어 있습니다. 예를 들어:

특히 /core/error/validation.ts에 정의된 ErrorGroups 클래스는 여러 파일에서 동시에 발생한 유효성 검사 에러들을 그룹화하여 한 번에 처리할 수 있도록 돕습니다. 이는 YaksokSessionvalidate() 메소드에서 활용됩니다.

에러 메시지 렌더링 및 컨벤션

사용자에게 에러를 친절하고 명확하게 보여주는 것은 매우 중요합니다. '달빛 약속'은 /core/error/render-error-string.ts에 정의된 renderErrorString 함수를 사용하여 YaksokError 인스턴스를 읽기 쉬운 문자열 형태로 변환합니다.

이 함수는 에러 메시지뿐만 아니라, 에러가 발생한 코드의 위치(줄 번호, 컬럼)와 해당 코드 스니펫까지 함께 보여주어 사용자가 문제를 쉽게 파악하고 해결할 수 있도록 돕습니다.

특히, renderErrorString 함수는 **ANSI 터미널 문자(ANSI Escape Codes)**를 사용하여 에러 메시지에 색상과 스타일을 적용합니다. 이는 터미널 환경에서 에러 메시지의 가독성을 크게 높여줍니다.

에러의 전파와 처리

'달빛 약속'의 에러는 JavaScript/TypeScript의 예외(Exception) 메커니즘과 유사하게 동작합니다. 에러가 발생하면 현재 실행 흐름이 중단되고, 가장 가까운 try...catch 블록으로 전파됩니다.

YaksokSessionrunModule 메소드는 코드 실행 중 발생하는 모든 YaksokErrorcatch하여 사용자에게 적절한 방식으로 (stderr를 통해) 출력하고, 실행 결과를 담은 RunModuleResult 객체에 에러 정보를 포함하여 반환합니다.

또한, Executer에서 설명했던 ReturnSignal이나 BreakSignal과 같은 특별한 시그널들도 내부적으로는 예외처럼 동작하며, executer 함수에서 이를 캐치하여 CannotReturnOutsideFunctionErrorBreakNotInLoopError와 같은 YaksokError로 변환하여 처리됩니다.