에러 레퍼런스
달빛약속 코드를 실행할 때 발생할 수 있는 에러 목록입니다. 모든 에러는 YaksokError를 상속하며, @dalbit-yaksok/core에서 가져올 수 있습니다.
ts
import { NotDefinedIdentifierError } from '@dalbit-yaksok/core'에러를 기계가 읽을 수 있는 형태로 변환하려면 3.1. 기계가 읽을 수 있는 에러 문서를 참고하세요.
문법 및 파싱 에러
코드 구조에 문제가 있을 때 발생합니다.
| 에러 | 메시지 (예시) | 원인 |
|---|---|---|
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 | 범위의 끝은 정수여야 해요. | 범위 끝이 정수가 아님 |
RangeStartMustNotBeGreaterThanEndError | 범위의 시작은 끝보다 클 수 없어요. | 시작이 끝보다 큼 |
약속(함수) 에러
약속 정의나 호출 중 문제가 있을 때 발생합니다.
| 에러 | 메시지 (예시) | 원인 |
|---|---|---|
AlreadyDefinedFunctionError | 이미 "..."라는 약속(번역)이 있어요 | 같은 이름의 약속 중복 정의 |
FunctionMustHaveOneOrMoreStringPartError | 약속(번역)을 선언할 때엔 적어도 하나의 고정되는 부분이 있어야 해요. | 약속 이름에 고정 문자열 부분이 없음 |
CannotReturnOutsideFunctionError | "약속 그만"은 약속 안에서만 사용할 수 있어요. | 약속 바깥에서 약속 그만 사용 |
CallStackDepthExceededError | 약속을 너무 깊이 호출했어요. | 재귀 호출이 너무 깊어짐 (스택 오버플로우) |
반복문 에러
반복문 사용 중 문제가 있을 때 발생합니다.
| 에러 | 메시지 (예시) | 원인 |
|---|---|---|
BreakNotInLoopError | "반복 그만"은 반복문 안에서만 사용할 수 있어요. | 반복문 바깥에서 반복 그만 사용 |
NoBreakOrReturnError | 반복문 안에 "반복 그만"이나 "반환"이 없어요. | 무한 반복 가능성 (탈출 조건 없음) |
LoopCountIsNotNumberError | 반복 횟수는 숫자여야 해요. | N번 반복에서 N이 숫자가 아님 |
LoopWithoutBodyError | 반복문에 실행할 내용이 없어요. | 빈 반복문 |
클래스 에러
클래스 정의나 인스턴스 사용 중 문제가 있을 때 발생합니다.
| 에러 | 메시지 (예시) | 원인 |
|---|---|---|
AlreadyDefinedClassError | ... 클래스는 이미 정의되어 있습니다. | 같은 이름의 클래스 중복 정의 |
InvalidParentClassError | ...은(는) 부모 클래스로 쓸 수 없습니다. | 존재하지 않거나 클래스가 아닌 값을 상속 |
NotAClassError | ...은(는) 클래스가 아닙니다. | 새 키워드에 클래스가 아닌 값 사용 |
DotAccessOnlyOnInstanceError | 온점(.)은 인스턴스에만 사용할 수 있습니다. | 인스턴스가 아닌 값에 . 사용 |
ConstructorArityMismatchError | ...의 __준비__에 인자 N개를 넘겼지만... | 생성자에 잘못된 수의 인자 전달 |
ConstructorArityAmbiguousError | ...의 __준비__에 인자 N개 생성자가 여러 개 있어 모호합니다. | 같은 인자 수의 생성자가 여러 개 |
MemberNotFoundError | ... 인스턴스에서 ... 멤버를 찾을 수 없습니다. | 존재하지 않는 멤버 접근 |
MemberFunctionNotFoundError | ... 인스턴스에서 ... 멤버 메서드를 찾을 수 없습니다. | 존재하지 않는 메서드 호출 |
AlreadyDefinedMemberFunctionError | ... 클래스의 ... 메서드는 이미 정의되어 있습니다. | 같은 이름의 메서드 중복 정의 |
번역(FFI) 에러
외부 번역 실행 중 문제가 있을 때 발생합니다.
| 에러 | 메시지 (예시) | 원인 |
|---|---|---|
FFIRuntimeNotFound | 번역(...)을 처리할 수 있는 실행 환경이 없어요. | 해당 런타임 이름의 확장 패키지가 등록되지 않음 |
MultipleFFIRuntimeError | 번역(...)을 처리할 수 있는 실행 환경이 여러 개 있어요. | 같은 런타임 이름의 확장이 여러 개 |
FFIResultTypeIsNotForYaksokError | 번역 "..."의 결과값 ...는 약속에서 사용할 수 있는 값이 아니에요. | FFI가 약속 호환 타입이 아닌 값을 반환 |
ErrorInFFIExecution | (내부 에러 메시지) | 번역 실행 중 에러 발생 |
ErrorOccurredWhileRunningFFIExecution | 번역 ("...")을 실행 중에 문제가 발생했어요. | 번역 실행 중 래핑된 에러 |
모듈 에러
모듈 관리 중 문제가 있을 때 발생합니다.
| 에러 | 메시지 (예시) | 원인 |
|---|---|---|
FileForRunNotExistError | 실행하려는 파일 "main"을(를) 찾을 수 없어요. | runModule()에 존재하지 않는 모듈 이름 전달 |
AlreadyRegisteredModuleError | 모듈 "..."은(는) 이미 등록되어 있어요. | 같은 이름으로 addModule() 중복 호출 |
ErrorInModuleError | 다른 약속 파일 ...에서 오류가 발생했어요. | 불러온 모듈에서 에러 발생 (래핑) |
호스트 환경에서 에러 처리하기
runModule()의 반환값을 통해 에러를 확인할 수 있습니다.
ts
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를 사용해 특정 에러 타입을 구분할 수도 있습니다.
ts
import { NotDefinedIdentifierError } from '@dalbit-yaksok/core'
if (result.reason === 'error') {
if (result.error instanceof NotDefinedIdentifierError) {
console.log('정의되지 않은 변수:', result.error.resource?.name)
}
}