Menangani Panic
Cara menangani panic di aplikasi Wails Anda
Pada aplikasi Go, panic dapat terjadi saat runtime ketika sesuatu yang tidak terduga terjadi. Panduan ini menjelaskan cara menangani panic baik di kode Go secara umum maupun secara khusus di aplikasi Wails Anda.
Memahami Panic di Go
Sebelum masuk ke penanganan panic khusus Wails, penting untuk memahami cara kerja panic di Go:
- Panic digunakan untuk error yang tidak dapat dipulihkan dan seharusnya tidak terjadi selama operasi normal
- Ketika panic terjadi di goroutine, hanya goroutine tersebut yang terpengaruh
- Panic dapat dipulihkan menggunakan
deferdanrecover()
Berikut contoh dasar penanganan panic di Go:
func doSomething() {
// Deferred functions run even when a panic occurs
defer func() {
if r := recover(); r != nil {
fmt.Printf("Recovered from panic: %v\n", r)
}
}()
// Your code that might panic
panic("something went wrong")
}Untuk informasi lebih detail tentang panic dan recover di Go, lihat Go Blog: Defer, Panic, and Recover.
Penanganan Panic di Wails
Wails secara otomatis menangani panic yang terjadi di method Service Anda ketika dipanggil dari frontend. Artinya Anda tidak perlu menambahkan panic recovery ke method tersebut — Wails akan menangkap panic dan memprosesnya melalui panic handler yang Anda konfigurasi.
Panic handler dirancang khusus untuk menangkap:
- Panic di method service terikat yang dipanggil dari frontend
- Panic internal dari runtime Wails
Untuk skenario lain, seperti goroutine latar belakang atau kode Go mandiri, Anda harus menangani panic sendiri menggunakan mekanisme panic recovery standar Go.
Struct PanicDetails
Ketika panic terjadi, Wails menangkap informasi penting tentang panic dalam struct PanicDetails:
type PanicDetails struct {
StackTrace string // The stack trace of where the panic occurred. Potentially trimmed to provide more context
Error error // The error that caused the panic
Time time.Time // The time when the panic occurred
FullStackTrace string // The complete stack trace including runtime frames
}Struct ini menyediakan informasi komprehensif tentang panic:
StackTrace: String terformat yang menampilkan call stack yang mengarah ke panicError: Error atau pesan panic yang sebenarnyaTime: Waktu tepat ketika panic terjadiFullStackTrace: Stack trace lengkap termasuk frame runtime
Panic Handler Default
Jika Anda tidak menentukan panic handler kustom, Wails akan menggunakan handler default yang menampilkan informasi error dalam pesan log terformat lalu keluar.
Contoh:
************************ FATAL ******************************
* There has been a catastrophic failure in your application *
********************* Error Details *************************
panic error: oh no! something went wrong deep in my service! :(
main.(*WindowService).call2
at E:/wails/v3/examples/panic-handling/main.go:23
main.(*WindowService).call1
at E:/wails/v3/examples/panic-handling/main.go:19
main.(*WindowService).GeneratePanic
at E:/wails/v3/examples/panic-handling/main.go:15
*************************************************************Panic Handler Kustom
Anda dapat mengimplementasikan panic handler sendiri dengan mengatur opsi PanicHandler saat membuat aplikasi. Berikut contohnya:
app := application.New(application.Options{
Name: "My App",
PanicHandler: func(panicDetails *application.PanicDetails) {
fmt.Printf("*** Custom Panic Handler ***\n")
fmt.Printf("Time: %s\n", panicDetails.Time)
fmt.Printf("Error: %s\n", panicDetails.Error)
fmt.Printf("Stacktrace: %s\n", panicDetails.StackTrace)
fmt.Printf("Full Stacktrace: %s\n", panicDetails.FullStackTrace)
// You could also:
// - Log to a file
// - Send to a crash reporting service
// - Show a user-friendly error dialog
// - Attempt to recover or restart the application
},
})Untuk contoh kerja lengkap penanganan panic di aplikasi Wails, lihat contoh panic-handling di v3/examples/panic-handling.
Catatan Akhir
Ingat bahwa panic handler Wails khusus untuk mengelola panic di method terikat dan error runtime internal. Untuk bagian lain aplikasi Anda, gunakan pola error handling standar Go dan mekanisme panic recovery yang sesuai. Seperti semua aplikasi Go, lebih baik mencegah panic melalui error handling yang tepat jika memungkinkan.