Language 10 of 10 · Topic 0.10

Error Handling: Explicit (val, err), defer, panic & recover()

1Concept

Go uses explicit error returns (if err != nil). defer executes cleanup functions in LIFO order upon function exit. panic unwinds the stack, which can be intercepted via recover() inside deferred functions.

2Architecture Diagram

defer runs in LIFO order on return:
 defer file.Close()
 defer mutex.Unlock()

Panic ──► Unwinds stack ──► Intercepted by recover() in deferred function!

3Code Example

Stage 0 Language Foundations
package main

import (
    "errors"
    "fmt"
)

func safeDivide(a, b int) (result int, err error) {
    // Protect against panics
    defer func() {
        if r := recover(); r != nil {
            err = fmt.Errorf("recovered from runtime panic: %v", r)
        }
    }()

    if b == 0 {
        return 0, errors.New("divisor cannot be zero")
    }
    return a / b, nil
}

func main() {
    fmt.Println("=== Go Explicit Error Handling & Panic Recovery ===")
    
    // Normal Error
    if _, err := safeDivide(10, 0); err != nil {
        fmt.Printf("[Handled Error] %v\n", err)
    }

    // Success Case
    if val, err := safeDivide(100, 5); err == nil {
        fmt.Printf("[Success] 100 / 5 = %d\n", val)
    }
}

4Expected Output

=== Go Explicit Error Handling & Panic Recovery ===
[Handled Error] divisor cannot be zero
[Success] 100 / 5 = 20

5Key Takeaways

  • Always check if err != nil immediately after calling fallible functions.
  • defer guarantees resource release (files, mutexes, sockets) even during errors.
  • Reserve panic and recover for catastrophic, unrecoverable programmer bugs.