Go با مثال: panic

panic معمولاً یعنی چیزی به‌طور غیرمنتظره خراب شده است. بیشتر از آن استفاده می‌کنیم تا در برابر خطاهایی که نباید در عملکرد عادی رخ دهند، یا آمادهٔ مدیریت درستشان نیستیم، سریع شکست بخوریم (fail fast).

package main
import (
    "os"
    "path/filepath"
)
func main() {

در سراسر این سایت از panic برای بررسی خطاهای غیرمنتظره استفاده می‌کنیم. این تنها برنامهٔ سایت است که عمداً طوری طراحی شده که panic کند.

    panic("a problem")

یک کاربرد رایج panic، توقف برنامه است وقتی تابعی مقدار خطایی برمی‌گرداند که نمی‌دانیم چطور مدیریتش کنیم (یا نمی‌خواهیم). این نمونه‌ای از panic کردن است، اگر هنگام ساختن یک فایل جدید خطای غیرمنتظره‌ای بگیریم.

    path := filepath.Join(os.TempDir(), "file")
    _, err := os.Create(path)
    if err != nil {
        panic(err)
    }
}

اجرای این برنامه باعث panic می‌شود؛ یک پیام خطا و ردپای گوروتین‌ها چاپ می‌شود و برنامه با وضعیت غیرصفر خارج می‌شود.

وقتی اولین panic در main اجرا شود، برنامه بدون رسیدن به بقیهٔ کد خارج می‌شود. اگر می‌خواهید ببینید برنامه سعی می‌کند یک فایل موقت بسازد، panic اول را کامنت کنید.

$ go run panic.go
panic: a problem
goroutine 1 [running]:
main.main()
    /.../panic.go:12 +0x47
...
exit status 2

توجه کنید که برخلاف برخی زبان‌ها که برای مدیریت بسیاری از خطاها از استثنا (exception) استفاده می‌کنند، در Go روش رایج این است که هر جا ممکن است از مقادیر بازگشتیِ نشان‌دهندهٔ خطا استفاده کنیم.

مثال بعدی: .