Skip to content

11. 에러 레퍼런스

달빛약속 코드를 실행할 때 발생할 수 있는 에러 목록입니다. 모든 에러는 YaksokError를 상속하며, @dalbit-yaksok/core에서 가져올 수 있습니다.

import { NotDefinedIdentifierError } from '@dalbit-yaksok/core'

코드 구조에 문제가 있을 때 발생합니다.

에러 메시지 (예시) 원인
CannotParseError "..."는 실행할 수 있는 코드가 아니에요. 파서가 해석할 수 없는 구문
IndentIsNotMultipleOf4Error 들여쓰기는 4의 배수여야 해요. 들여쓰기가 4칸 단위가 아님
IndentLevelMismatchError 들여쓰기가 잘못되었어요. 예상과 다른 들여쓰기 깊이
UnexpectedCharError 문자 ...는 ...에 사용할 수 없어요. 허용되지 않는 문자 사용
UnexpectedNewlineError ...엔 줄바꿈을 사용할 수 없어요. 줄바꿈이 허용되지 않는 위치
UnexpectedEndOfCodeError "..."가 나와야 했지만 코드가 끝났어요. 코드가 미완성 상태로 종료
UnexpectedTokenError ...은 ...에 사용할 수 없어요. 예상과 다른 토큰 등장

변수 이름이나 사용에 문제가 있을 때 발생합니다.

에러 메시지 (예시) 원인
NotDefinedIdentifierError "이름"라는 변수나 약속을 찾을 수 없어요. 정의되지 않은 변수나 약속 사용
NotProperIdentifierNameToDefineError "..."는 변수나 약속의 이름으로 사용할 수 없어요. 예약어를 변수/약속 이름으로 사용

계산이나 비교 중 문제가 있을 때 발생합니다.

에러 메시지 (예시) 원인
InvalidTypeForOperatorError ...는 더하기할 수 없어요. 해당 연산자가 지원하지 않는 타입 조합
InvalidTypeForCompareError ...와 ...는 비교할 수 없어요. 비교할 수 없는 타입 조합
UnknownOperatorError ...는 알 수 없는 연산자에요. 알 수 없는 연산자
NotBooleanTypeError 참/거짓(Boolean) 타입이어야 해요. 참/거짓이 필요한 곳에 다른 타입 사용
InvalidFormulaError 계산식이 올바르지 않아요. 수식 구조 오류
FormulaStackUnderflowError 연산할 값이 부족해요. 수식에서 피연산자 부족

목록, 사전, 문자열 접근 중 문제가 있을 때 발생합니다.

에러 메시지 (예시) 원인
IndexKeyNotFoundError ...에는 ...라는 값이 없어요. 존재하지 않는 키/인덱스 접근
StringIndexOutOfRangeError ...에서 N번째 글자를 가져올 수 없어요. 문자열 인덱스 초과
ListIndexMustBeGreaterOrEqualThan0Error 목록의 인덱스는 0보다 크거나 같아야 해요. 음수 인덱스 사용
ListIndexTypeError 목록의 인덱스는 정수여야 해요. 정수가 아닌 값으로 인덱스 접근
TargetIsNotIndexedValueError ...는 인덱스로 값을 가져올 수 없어요. 인덱싱을 지원하지 않는 값에 [] 사용
TupleNotMutableError 튜플은 한 번 만들면 값을 바꿀 수 없어요. 튜플 값 변경 시도
NotEnumerableValueForListLoopError ...는 목록 반복문에서 사용할 수 없어요. 목록이 아닌 값으로 목록 반복문 사용
에러 메시지 (예시) 원인
RangeStartMustBeNumberError 범위의 시작은 숫자여야 해요. 범위 시작이 숫자가 아님
RangeEndMustBeNumberError 범위의 끝은 숫자여야 해요. 범위 끝이 숫자가 아님
RangeStartMustBeIntegerError 범위의 시작은 정수여야 해요. 범위 시작이 정수가 아님
RangeEndMustBeIntegerError 범위의 끝은 정수여야 해요. 범위 끝이 정수가 아님
RangeStartMustBeLessThanEndError 범위의 시작은 끝보다 클 수 없어요. 시작이 끝보다 큼

약속 정의나 호출 중 문제가 있을 때 발생합니다.

에러 메시지 (예시) 원인
AlreadyDefinedFunctionError 이미 "..."라는 약속(번역)이 있어요 같은 이름의 약속 중복 정의
FunctionMustHaveOneOrMoreStringPartError 약속(번역)을 선언할 때엔 적어도 하나의 고정되는 부분이 있어야 해요. 약속 이름에 고정 문자열 부분이 없음
CannotReturnOutsideFunctionError "약속 그만"은 약속 안에서만 사용할 수 있어요. 약속 바깥에서 약속 그만 사용
CallStackDepthExceededError 약속을 너무 깊이 호출했어요. 재귀 호출이 너무 깊어짐 (스택 오버플로우)

반복문 사용 중 문제가 있을 때 발생합니다.

에러 메시지 (예시) 원인
BreakNotInLoopError "반복 그만"은 반복문 안에서만 사용할 수 있어요. 반복문 바깥에서 반복 그만 사용
NoBreakOrReturnError 반복문 안에 "반복 그만"이나 "반환"이 없어요. 무한 반복 가능성 (탈출 조건 없음)
LoopCountIsNotNumberError 반복 횟수는 숫자여야 해요. N번 반복에서 N이 숫자가 아님
LoopWithoutBodyError 반복문에 실행할 내용이 없어요. 빈 반복문

외부 번역 실행 중 문제가 있을 때 발생합니다.

에러 메시지 (예시) 원인
FFIRuntimeNotFound 번역(...)을 처리할 수 있는 실행 환경이 없어요. 해당 런타임 이름의 확장 패키지가 등록되지 않음
MultipleFFIRuntimeError 번역(...)을 처리할 수 있는 실행 환경이 여러 개 있어요. 같은 런타임 이름의 확장이 여러 개
FFIResultTypeIsNotForYaksokError 번역 "..."의 결과값 ...는 약속에서 사용할 수 있는 값이 아니에요. FFI가 약속 호환 타입이 아닌 값을 반환
ErrorInFFIExecution (내부 에러 메시지) 번역 실행 중 에러 발생
ErrorOccurredWhileRunningFFIExecution 번역 ("...")을 실행 중에 문제가 발생했어요. 번역 실행 중 래핑된 에러

모듈 관리 중 문제가 있을 때 발생합니다.

에러 메시지 (예시) 원인
FileForRunNotExistError 실행하려는 파일 "main"을(를) 찾을 수 없어요. runModule()에 존재하지 않는 모듈 이름 전달
AlreadyRegisteredModuleError 모듈 "..."은(는) 이미 등록되어 있어요. 같은 이름으로 addModule() 중복 호출
ErrorInModuleError 다른 약속 파일 ...에서 오류가 발생했어요. 불러온 모듈에서 에러 발생 (래핑)

호스트 환경에서 에러 처리하기

Section titled “호스트 환경에서 에러 처리하기”

runModule()의 반환값을 통해 에러를 확인할 수 있습니다.

const results = await session.runModule('main')
const result = results.get('main')!
switch (result.reason) {
case 'finish':
// 성공
break
case 'error':
console.error(result.error) // YaksokError
break
case 'validation':
console.error(result.errors) // Map<string, YaksokError[]>
break
case 'aborted':
// AbortSignal에 의해 중단됨
break
}

instanceof를 사용해 특정 에러 타입을 구분할 수도 있습니다.

import { NotDefinedIdentifierError } from '@dalbit-yaksok/core'
if (result.reason === 'error') {
if (result.error instanceof NotDefinedIdentifierError) {
console.log('정의되지 않은 변수:', result.error.resource?.name)
}
}