# 9. Error Handling

Wrap code that might fail in `try { ... } catch (e) { ... }`. If anything in the
`try` block raises a runtime error, execution jumps to `catch` and `e` holds the
error message (a string).

```stencil
try {
    let x = 10 / 0;        // division by zero is a runtime error
    print("never reached");
} catch (e) {
    print("Caught error:", e);   // Caught error: Sıfıra bölme hatası
}
print("program continues");
```

## The error variable is optional
```stencil
try {
    let a = [1, 2];
    let bad = a[99];       // index out of bounds
} catch {
    print("something went wrong");
}
```

## Common catchable errors
- Division / modulo by zero
- List/string index out of bounds
- Undefined variable or function
- Calling a method that does not exist
- Wrong operand types for an operator

## Using it for safe parsing
```stencil
func safeDivide(a, b) {
    try {
        return a / b;
    } catch (e) {
        return null;        // signal failure
    }
}
print(safeDivide(10, 2));   // 5
print(safeDivide(10, 0));   // null
```

## Validating input
```stencil
func parseAge(text) {
    try {
        let n = int(text);
        if (n < 0) { return "negative not allowed"; }
        return n;
    } catch (e) {
        return "not a number";
    }
}
print(parseAge("25"));    // 25
```

Next: [Modules & Packages](10_modules_and_packages.md)
