Skip to main content

Error Handling

The expression evaluator never throws. Instead, all functions return result objects with a success field.

Result Types

EvaluateResult

type EvaluateSuccess = {
success: true;
result: unknown;
};

type EvaluateFailure = {
success: false;
error: ExtendedError; // Error object with message
errorType: string; // "TokenizationError" | "ParseError" | "CompilationError" | "EvaluationError"
errorCode: string; // Machine-readable error code
expression?: string; // Original expression (for runtime errors)
};

type EvaluateResult = EvaluateSuccess | EvaluateFailure;

CompileResult

type CompileSuccess = {
success: true;
result: CompiledExpression;
};

type CompileFailure = {
success: false;
error: ExtendedError;
errorType: string;
errorCode: string;
};

type CompileResult = CompileSuccess | CompileFailure;

Error Codes

Tokenization Errors

CodeCause
TOKENIZE_ERRORInvalid character or malformed token in the expression

Parse Errors

CodeCause
PARSE_ERRORSyntax error in the expression
PARSE_FAILEDParser could not produce an AST

Compilation Errors

CodeCause
COMPILE_ERRORError during AST interpretation setup
COMPILE_FAILEDAST interpretation setup failed

Evaluation Errors

CodeCause
EVALUATION_ERRORGeneral runtime error
EVAL_ERRORGeneral evaluation failure
TIMEOUT_EXCEEDEDExecution exceeded the timeout limit
MAX_CALL_STACK_EXCEEDEDFunction call nesting too deep
MAX_COMPLEXITY_EXCEEDEDExpression AST has too many nodes
MAX_LOOP_ITERATIONS_EXCEEDEDArray function iterations exceeded the limit
PROPERTY_ACCESS_DENIEDProperty access blocked by security policy
FUNCTION_ACCESS_DENIEDFunction call blocked by security policy
ARRAY_FEATURE_DISABLEDArray syntax used but enableArrays is false
TEMPLATE_STRINGS_DISABLEDTemplate string used but enableTemplateStrings is false
ARROW_FUNCTIONS_DISABLEDArrow function used but enableArrowFunctions is false
UNSUPPORTED_FUNCTION_CALLDynamic function reference not allowed
UNKNOWN_NODE_TYPEUnknown AST node encountered
INVALID_REGEX_PATTERNInvalid regex in allowedProperties/deniedProperties

Error Object

The error field on failure results is an ExtendedError with optional location information:

type ExtendedError = Error & {
code?: string; // Same as errorCode
line?: number; // Line number (1-based)
column?: number; // Column number (1-based)
};

Handling Patterns

Check Success

const result = evaluateExpression('user.age >= 18', context);

if (result.success) {
console.log(result.result);
} else {
console.error(`${result.errorCode}: ${result.error.message}`);
}

Handle Specific Error Codes

const result = evaluateExpression(expr, context, options);

if (!result.success) {
switch (result.errorCode) {
case 'TIMEOUT_EXCEEDED':
console.error('Expression took too long');
break;
case 'PROPERTY_ACCESS_DENIED':
console.error('Access denied to a property');
break;
case 'PARSE_ERROR':
console.error('Invalid expression syntax');
break;
default:
console.error(result.error.message);
}
}

Safe Evaluation

Use safeEvaluateExpression when you just need the value or null:

const value = safeEvaluateExpression('2 + 3', context);
// 5 on success, null on any error