Panic

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 
# တွေကို သုံးတာက ပုံမှန်လုပ်နည်းလုပ်ဟန် ဖြစ်ပါတယ်။