log.Panic în Go

Scrie mesajul în jurnal și apoi declanșează un panic cu același mesaj.

Sintaxă
func Panic(v ...any)
func Panicf(format string, v ...any)

Ce face log.Panic

log.Panic și log.Panicf scriu mesajul ca Print/Printf și apoi apelează panic cu textul mesajului. Spre deosebire de log.Fatal, funcțiile amânate cu defer rulează, iar panica poate fi prinsă cu recover.

Dacă nimeni nu prinde panica, programul se oprește cu mesajul și lista apelurilor (stack trace), cu codul de ieșire 2.

Parametri

Parametru Descriere
v Valorile mesajului.
format La Panicf: șablonul mesajului.

Ce returnează

Nu se întoarce normal; declanșează panic.

Exemple

Exemplul 1: Panică prinsă cu recover

package main

import (
    "fmt"
    "log"
    "os"
)

func proceseaza(cantitate int) {
    defer fmt.Println("defer: rulează și la panică")
    if cantitate < 0 {
        log.Panicf("cantitate negativă: %d", cantitate)
    }
    fmt.Println("procesat:", cantitate)
}

func main() {
    log.SetOutput(os.Stdout)
    log.SetFlags(0)

    defer func() {
        if r := recover(); r != nil {
            fmt.Printf("am prins panica: %v (tip %T)\n", r, r)
        }
    }()
    proceseaza(5)
    proceseaza(-2)
    fmt.Println("nu ajungem aici")
}

Rezultat

procesat: 5
defer: rulează și la panică
cantitate negativă: -2
defer: rulează și la panică
am prins panica: cantitate negativă: -2 (tip string)

Exemplul 2: Panică neprinsă

package main

import "log"

func main() {
    log.Panic("stare imposibilă: stoc negativ")
}

Rezultat în terminal (adresele diferă)

2025/03/14 10:30:00 stare imposibilă: stoc negativ
panic: stare imposibilă: stoc negativ

goroutine 1 [running]:
log.Panic({0x5e8454a48e88?, 0x0?, 0x5e8454a48e98?})
	/usr/local/go/src/log/log.go:451 +0x70
main.main()
	/home/ana/exemplu/main.go:6 +0x3c
exit status 2

Greșeli frecvente

  • Folosești log.Panic pentru erori obișnuite (fișier lipsă, date greșite). Panica este pentru situații care „nu ar trebui să se întâmple”; erorile normale se returnează.

Comenzi înrudite

  • log.Fatal: Scrie mesajul în jurnal și oprește imediat programul cu codul 1 (ca log.Print urmat de os.Exit(1)).
  • log.Printf: Scrie în jurnal un mesaj formatat după un șablon (ca fmt.Printf), precedat de dată și oră.
  • os.Exit: Oprește imediat programul cu codul de ieșire dat; funcțiile amânate cu defer nu mai rulează.