Panic
#
// `panic` ဆိုတာ ပုံမှန်အားဖြင့် တစ်ခုခု မမျှော်လင့်ဘဲ မှားယွင်းသွားတယ်ဆိုတာကို ဆိုလိုပါတယ်။
// အများအားဖြင့် ပုံမှန်အလုပ်လုပ်နေစဉ် မဖြစ်သင့်တဲ့ error တွေ ဖြစ်လာတဲ့အခါ သို့မဟုတ်
// ကျွန်တော်တို့က gracefully handle လုပ်ဖို့ မပြင်ဆင်ထားတဲ့ error တွေဖြစ်လာတဲ့အခါ
// fail fast ဖြစ်သွားအောင် သုံးလေ့ရှိပါတယ်။
package main
import "os"
func main() {
// ဒီ website တစ်ခုလုံးမှာ မမျှော်လင့်ထားတဲ့ error တွေကို စစ်ဆေးဖို့ panic ကို သုံးပါမယ်။
// ဒီပရိုဂရမ်က website ပေါ်မှာ panic ဖြစ်အောင် ရည်ရွယ်ချက်ရှိရှိ ဒီဇိုင်းလုပ်ထားတဲ့
// တစ်ခုတည်းသော ပရိုဂရမ်ပါ။
panic("a problem")
// Panic ကို အသုံးများတဲ့နေရာတစ်ခုကတော့ function တစ်ခုက ကျွန်တော်တို့ ဘယ်လိုကိုင်တွယ်ရမှန်းမသိတဲ့
// (သို့မဟုတ် ကိုင်တွယ်ချင်စိတ်မရှိတဲ့) error value တစ်ခုကို ပြန်ပေးလာတဲ့အခါ ပရိုဂရမ်ကို ရပ်တန့်ဖို့ပါ။
// ဒီမှာဆိုရင် file အသစ်တစ်ခု ဖန်တီးတဲ့အခါ မမျှော်လင့်ထားတဲ့ error တစ်ခုရရင် `panic` ဖြစ်စေတဲ့ ဥပမာပါ။
_, err := os.Create("/tmp/file")
if err != nil {
panic(err)
}
}
# ဒီပရိုဂရမ်ကို run လိုက်ရင် panic ဖြစ်သွားပြီး၊
# error message နဲ့ goroutine trace တွေကို
# ပြပေးပါလိမ့်မယ်။ ပြီးတော့ non-zero status
# နဲ့ exit ဖြစ်သွားပါလိမ့်မယ်။
# `main` ထဲက ပထမဆုံး panic က အလုပ်လုပ်သွားတဲ့အခါ၊
# ပရိုဂရမ်က ကျန်တဲ့ code တွေကို မရောက်တော့ဘဲ
# ထွက်သွားပါလိမ့်မယ်။ အကယ်၍ ပရိုဂရမ်က temp file
# တစ်ခု ဖန်တီးဖို့ ကြိုးစားတာကို မြင်ချင်ရင်
# ပထမဆုံး panic ကို comment out လုပ်ထားလိုက်ပါ။
$ go run panic.go
panic: a problem
goroutine 1 [running]:
main.main()
/.../panic.go:12 +0x47
...
exit status 2
# သတိပြုရမှာက တချို့ language တွေမှာ exception တွေကို
# error အများစုကို handle လုပ်ဖို့ သုံးကြပေမယ့်၊
# Go မှာတော့ ဖြစ်နိုင်သမျှနေရာတိုင်းမှာ
# error-indicating return value
# တွေကို သုံးတာက ပုံမှန်လုပ်နည်းလုပ်ဟန် ဖြစ်ပါတယ်။