에러 및 자원 한도
스크립트 진단은 크게 두 범주로 나뉜다: 노드를 편집하고 저장할 때 검출되는 정적(컴파일 시점) 에러와 워크플로우 실행 도중 발생하는 런타임 에러이다.
정적 에러 (컴파일 시점)
정적 에러는 속성 창에서 저장을 차단하며 정확한 줄:열 위치를 알려준다. 저장된 워크플로우 파일을 열었을 때 정적 검사에 실패하면(예: 지원하지 않는 스크립트 버전) 실행 시점에 SCRIPT_COMPILE_ERROR로 실패한다.
문법 진단 코드
| 진단 코드 | 의미 및 해결 방법 |
|---|---|
SCRIPT_SYNTAX_SOURCE_TOO_LARGE | 스크립트 소스 크기가 64 KiB를 초과함. 반복되는 논리를 함수나 루프로 묶는다. |
SCRIPT_SYNTAX_TAB_INDENT | 들여쓰기에 탭 문자가 사용됨. 단계당 공백 4칸으로 들여쓴다. |
SCRIPT_SYNTAX_INDENT_UNIT | 들여쓰기가 공백 4칸의 배수가 아님. |
SCRIPT_SYNTAX_INDENT_TOO_DEEP | 들여쓰기가 한 번에 4칸(한 단계)보다 많이 증가함. |
SCRIPT_SYNTAX_UNEXPECTED_INDENT | 새 블록이 열리지 않은 위치에서 들여쓰기가 증가함. |
SCRIPT_SYNTAX_EXPECTED_INDENT | 콜론(:) 다음 줄에 들여쓰기된 블록이 없음. |
SCRIPT_SYNTAX_BLOCK_SAME_LINE | 콜론(:)과 같은 줄에 블록 본문을 작성함. 다음 줄로 내려 공백 4칸 들여쓴다. |
SCRIPT_SYNTAX_SEMICOLON | 문장을 이어 붙이기 위해 세미콜론(;)을 사용함. 한 줄에 한 문장만 작성한다. |
SCRIPT_SYNTAX_LINE_CONTINUATION | 백슬래시(\) 줄 연결을 사용함. 여러 줄 식은 소괄호로 감싼다. |
SCRIPT_SYNTAX_UNCLOSED_BRACKET | 닫히지 않은 소괄호 ( 또는 대괄호 [가 있음. |
SCRIPT_SYNTAX_UNMATCHED_BRACKET | 짝이 맞지 않는 닫는 괄호가 있음. |
SCRIPT_SYNTAX_BRACE | f-string 바깥에서 중괄호 { }를 사용함 (딕셔너리와 집합은 지원하지 않음). |
SCRIPT_SYNTAX_UNKNOWN_CHAR | 문자열 리터럴과 주석 바깥에 인식할 수 없는 문자가 있음. |
SCRIPT_SYNTAX_RESERVED_NAME | 식별자가 예약된 이중 밑줄(__)로 시작함. |
SCRIPT_SYNTAX_FLOAT | 부동소수점 리터럴을 사용함. 정수만 지원한다. |
SCRIPT_SYNTAX_INVALID_NUMBER | 잘못된 형식의 정수 리터럴임. |
SCRIPT_SYNTAX_SINGLE_QUOTE | 작은따옴표 문자열을 사용함. 큰따옴표("...")를 사용한다. |
SCRIPT_SYNTAX_UNTERMINATED_STRING | 문자열 또는 바이트 리터럴의 닫는 따옴표가 누락됨. |
SCRIPT_SYNTAX_BAD_ESCAPE | 지원하지 않는 이스케이프 시퀀스임 (\\, \", \n, \r, \t, \uNNNN만 허용). |
SCRIPT_SYNTAX_HEX_INVALID_CHAR | h"..." 리터럴에 16진수가 아닌 문자(또는 0x 접두어)가 포함됨. |
SCRIPT_SYNTAX_HEX_ODD_DIGITS | h"..." 리터럴의 16진수 숫자 개수가 홀수임. |
SCRIPT_SYNTAX_BIN_INVALID_CHAR | b"..." 리터럴에 0, 1, 공백 이외의 문자가 포함됨 (16진수는 h"...", UTF-8 텍스트는 s"..." 사용). |
SCRIPT_SYNTAX_BIN_BIT_COUNT | b"..." 리터럴의 비트 개수가 8의 배수가 아님. |
SCRIPT_SYNTAX_LITERAL_PREFIX_SPACE | 리터럴 접두어(h/b/s/f)와 여는 따옴표 사이에 공백이 있음. |
SCRIPT_SYNTAX_LITERAL_MIXED_KIND | 서로 다른 종류의 인접 리터럴을 이어 붙임. + 연산자를 사용한다. |
SCRIPT_SYNTAX_LITERAL_CONCAT_OUTSIDE_PAREN | 소괄호 바깥에서 인접 리터럴을 이어 붙임. (...)로 감싸거나 +를 사용한다. |
SCRIPT_SYNTAX_FSTRING_BRACE | f-string 안에 이스케이프되지 않은 단독 }가 있음. 문자 그대로 쓰려면 }}로 표기한다. |
SCRIPT_SYNTAX_FSTRING_FIELD | 잘못된 f-string 보간 필드임 (식 내부에는 따옴표, 중괄호, 백슬래시를 쓸 수 없음). |
SCRIPT_SYNTAX_FSTRING_EMPTY | f-string 안에 빈 보간 필드 {}가 있음. |
SCRIPT_SYNTAX_UNEXPECTED_TOKEN | 문장이나 식에 예상치 못한 토큰이 나타남. |
SCRIPT_SYNTAX_UNSUPPORTED | 지원하지 않는 Python 구문(import, class, while, lambda, try, print 등)을 사용함. |
SCRIPT_SYNTAX_UNSUPPORTED_OPERATOR | 지원하지 않는 연산자(** 또는 /)를 사용함. pow(base, exp, mod) 또는 //를 사용한다. |
SCRIPT_SYNTAX_ATTRIBUTE | 속성 접근 또는 메서드 호출(.)을 사용함. 내장 함수를 직접 호출한다. |
SCRIPT_SYNTAX_COMPREHENSION | 리스트 컴프리헨션을 사용함. for 루프와 += [item]을 사용한다. |
SCRIPT_SYNTAX_CHAINED_COMPARISON | 연쇄 비교(a < b < c)를 사용함. (a < b) and (b < c)로 풀어서 작성한다. |
SCRIPT_SYNTAX_CALL_TARGET | 식별자가 아닌 일반 식을 함수처럼 호출함. |
SCRIPT_SYNTAX_POSITIONAL_AFTER_KEYWORD | 키워드 인자 뒤에 위치 인자를 전달함. |
SCRIPT_SYNTAX_EXPR_STATEMENT | 함수 호출이 아닌 일반 식을 단독 문장으로 사용함. |
SCRIPT_SYNTAX_DANGLING_ELSE | 대응하는 if 없이 elif 또는 else를 사용함. |
SCRIPT_SYNTAX_NESTED_DEF | 다른 블록 내부에 함수를 정의함. 모든 함수는 최상위에 정의한다. |
SCRIPT_SYNTAX_ANNOTATION_NO_VALUE | 초기값 없이 타입 표기만 작성함 (x: int = 0처럼 초기값을 함께 작성). |
SCRIPT_SYNTAX_UNPACK_RHS | 튜플 언패킹 대입의 우변이 튜플이나 함수 호출이 아님. |
SCRIPT_SYNTAX_TUPLE_CONTEXT | return 문이나 언패킹 대입 이외의 위치에서 튜플을 사용함. |
SCRIPT_SYNTAX_TUPLE_ARITY | tuple[...] 반환 타입 표기의 원소 타입이 2개 미만임. |
SCRIPT_SYNTAX_PARAM_TYPE | 함수 매개변수에 타입 표기가 누락됨. |
SCRIPT_SYNTAX_PARAM_DEFAULT | 사용자 정의 함수의 매개변수에 기본값을 지정함. |
SCRIPT_SYNTAX_UNKNOWN_TYPE | 알 수 없는 타입 이름을 표기함 (int, bool, bytes, string, list[...] 사용). |
SCRIPT_SYNTAX_NESTED_LIST | 중첩 리스트 타입 표기 list[list[...]]는 지원하지 않음. |
이름·타입·흐름 진단 코드
| 진단 코드 | 의미 및 해결 방법 |
|---|---|
SCRIPT_TYPE_MISMATCH | 대입문, 조건식, 연산자 피연산자 또는 함수 인자의 타입이 일치하지 않음. |
SCRIPT_OUTPUT_TYPE_MISMATCH | 출력 포트 변수에 대입한 값의 타입이 해당 포트의 선언 타입과 다름. |
SCRIPT_OUTPUT_UNASSIGNED | 모든 실행 경로에서 출력 포트 변수가 확정 대입되지 않음 (확정 대입 검사 참고). |
SCRIPT_UNASSIGNED | 모든 경로에서 대입이 보장되지 않은 변수를 읽으려 함. |
SCRIPT_INPUT_READONLY | 읽기 전용인 입력 포트 변수에 값을 재대입하거나 수정하려 함. |
SCRIPT_NAME_UNDEFINED | 정의되지 않은 변수 또는 함수 이름을 참조함. |
SCRIPT_NAME_RESERVED | 내장 함수 이름을 변수나 사용자 정의 함수 이름으로 사용함. |
SCRIPT_NAME_CONFLICT | 식별자가 기존 함수, 변수, 상수, 매개변수 또는 포트 이름과 충돌함. |
SCRIPT_CONST_NOT_TOP | 대문자 상수를 최상위가 아닌 블록 내부에서 정의함. |
SCRIPT_CONST_REASSIGN | 불변 상수에 값을 재대입하거나 수정하려 함. |
SCRIPT_CONST_INVALID | 상수 초기화 식에서 일반 변수나 입력 포트를 참조함. |
SCRIPT_FUNC_SCOPE | 함수 본문에서 최상위 변수, 입력 포트 또는 출력 포트를 직접 참조함. |
SCRIPT_FUNC_ORDER | 정의되기 전의 사용자 함수를 호출하거나 재귀 호출을 시도함. |
SCRIPT_CALL_ARGS | 함수 호출의 인자 개수가 맞지 않거나 잘못된 키워드 인자 이름을 사용함. |
SCRIPT_RETURN_OUTSIDE | 함수 바깥에서 return 문을 사용함. |
SCRIPT_RETURN_TYPE | 반환값의 타입이 함수에 선언된 반환 타입과 일치하지 않음. |
SCRIPT_RETURN_MISSING | 값을 반환하는 함수에 return으로 끝나지 않는 실행 경로가 있음. |
SCRIPT_TUPLE_MISMATCH | 튜플 언패킹 좌변 변수의 개수가 맞지 않거나 같은 변수가 중복됨. |
SCRIPT_TUPLE_MISMATCH / SCRIPT_TUPLE_CONTEXT | 언패킹이나 return 이외의 곳에서 튜플 값을 사용함. |
SCRIPT_RANGE_CONTEXT | for 루프 헤더 이외의 위치에서 range(...)를 사용함. |
SCRIPT_LOOP_CONTROL_OUTSIDE | for 루프 바깥에서 break 또는 continue를 사용함. |
SCRIPT_EMPTY_LIST | 명시적 타입 표기 없이 빈 리스트 []를 사용함 (xs: list[bytes] = []처럼 표기). |
SCRIPT_NESTED_LIST | 중첩 리스트를 생성하려 함. |
SCRIPT_INT_LITERAL_TOO_LARGE | 정수 리터럴이 1,048,576비트를 초과함. |
SCRIPT_FORMAT_INVALID | 식의 타입에 맞지 않는 f-string 포맷 지정자이거나 필드 폭 한도(> 4,096)를 초과함. |
포트 스키마 진단 코드
| 진단 코드 | 의미 및 해결 방법 |
|---|---|
SCRIPT_PORT_INVALID_ID | 포트 이름이 식별자 규칙([A-Za-z_][A-Za-z0-9_]*)을 위반하거나 __로 시작함. |
SCRIPT_PORT_RESERVED_ID | 포트 이름이 예약어 또는 내장 함수 이름과 충돌함. |
SCRIPT_PORT_DUPLICATE_ID | Script 노드 내 두 포트가 동일한 이름·ID를 가짐. |
SCRIPT_PORT_INVALID_TYPE | 포트 데이터 타입이 bytes, int, bool, string 중 하나가 아님. |
런타임 에러
| 에러 코드 | 의미 | 예시 |
|---|---|---|
SCRIPT_COMPILE_ERROR | 저장된 스크립트가 정적 검증에 실패했거나 지원하지 않는 스크립트 버전을 사용함. | — |
SCRIPT_DIVISION_BY_ZERO | // 또는 % 연산의 제수가 0임. | 1 // 0 |
SCRIPT_INDEX_OUT_OF_RANGE | 리스트 인덱스 또는 슬라이스 범위가 리스트 길이를 벗어남. | [1, 2][5] |
SCRIPT_INVALID_ARGUMENT | 음수 비트 시프트 횟수, 0인 range 증분(step), 또는 잘못된 pow 인자임. | 1 << -1 |
SCRIPT_INVALID_ERROR_CODE | fail(code, message)에 전달한 사용자 정의 코드가 예약된 SCRIPT_ 또는 BYTES_로 시작함. | — |
SCRIPT_SIZE_LIMIT | 정수 비트 길이, 리스트 길이 또는 루프 반복 횟수가 1,048,576을 초과함. | 1 << 2000000 |
SCRIPT_STEP_LIMIT | 실행 중 평가 스텝 수가 10,000,000 한도를 초과함. | — |
SCRIPT_TIMEOUT | 실제 경과 실행 시간이 시간 한도(웹 3초, API Container 10초)를 초과함. | — |
SCRIPT_INTERNAL_ERROR | 예상치 못한 인터프리터 내부 오류임. | — |
바이트 연산 에러
| 에러 코드 | 의미 | 예시 |
|---|---|---|
BYTES_OUT_OF_RANGE | 바이트 인덱스 또는 슬라이스 범위가 버퍼 경계를 벗어남. | h"01 02"[2] |
BYTES_LENGTH_MISMATCH | 바이트열 비트 연산의 두 피연산자 길이가 다르거나 슬라이스 대입 길이가 맞지 않음. | h"01" ^ h"01 02" |
BYTES_INT_OVERFLOW | 정수가 지정한 바이트 길이와 부호 설정 범위 안에 들어가지 않음. | to_bytes(256, 1) |
BYTES_INVALID_HEX | from_hex에 유효하지 않은 16진수 문자열이 전달됨. | from_hex("zz") |
BYTES_INVALID_UTF8 | to_utf8에 유효하지 않은 UTF-8 바이트 시퀀스가 전달됨. | to_utf8(h"c3 28") |
BYTES_INVALID_ARGUMENT | 음수 길이·횟수, 범위를 벗어난 바이트 값 또는 잘못된 엔디안 문자열이 전달됨. | to_int(h"01", "middle") |
BYTES_SIZE_LIMIT | 결과 바이트열 크기가 16 MiB 버퍼 한도를 초과함. | zeros(20000000) |
자원 한도
| 자원 | 한도 | 초과 시 에러 코드 |
|---|---|---|
| 평가 스텝 수 | 10,000,000 | SCRIPT_STEP_LIMIT |
단일 bytes 버퍼 크기 | 16 MiB | BYTES_SIZE_LIMIT |
단일 list 길이 / for 루프 반복 횟수 | 1,048,576 | SCRIPT_SIZE_LIMIT |
단일 int 비트 길이 | 1,048,576비트 | SCRIPT_SIZE_LIMIT (또는 SCRIPT_INT_LITERAL_TOO_LARGE) |
| 스크립트 소스 크기 | 64 KiB | SCRIPT_SYNTAX_SOURCE_TOO_LARGE |
| f-string 필드 폭 | 4,096 | SCRIPT_FORMAT_INVALID |
| 실행 제한 시간(Wall-Clock) | 3초 (웹) / 10초 (API Container) | SCRIPT_TIMEOUT |
o = 0
for i in range(1000000):
for j in range(100):
o += 1
o = 0
for i in range(2000000):
o += 1