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:

  1. Panic digunakan untuk error yang tidak dapat dipulihkan dan seharusnya tidak terjadi selama operasi normal
  2. Ketika panic terjadi di goroutine, hanya goroutine tersebut yang terpengaruh
  3. Panic dapat dipulihkan menggunakan defer dan recover()

Berikut contoh dasar penanganan panic di Go:

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:

go
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 panic
  • Error: Error atau pesan panic yang sebenarnya
  • Time: Waktu tepat ketika panic terjadi
  • FullStackTrace: 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:

text
************************ 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:

go
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.

Edit page

Last updated: