#29: Defer, Panic, & Recover - Belajar Golang Dari Dasar

By Rizky Kurniawan - October 6, 2022 ~3 mins read
Artikel ini merupakan bagian dari seri Belajar Golang Dari Dasar

Defer

Dalam bahasa pemrograman Go, defer adalah sebuah statement yang akan menunda pengeksekusian sebuah function, atau anonymous function hingga function terdekatnya selesai dieksekusi atau mengembalikan nilai. Mungkin pengertian ini sedikit membingungkan ya, tapi defer function ini mirip seperti defer yang kita gunakan pada tag script di html.

Berikut ini adalah contoh defer function di Golang:

package main

import "fmt"

func hello() {
	fmt.Println("Hello World!")
}

func main() {
	defer hello()
	fmt.Println("Show me")
}

output:

Show me
Hello World!

Dari contoh di atas, kamu bisa melihat bahwa ketika kita memanggil function diawali dengan defer statement akan dieksekusi setelah function main selesai dieksekusi. Ini dibuktikan dengan hasil output yang kita dapatkan yaitu text “Show me” akan diprint terlebih dahulu, baru setelah itu text “Hello World!” yang berasal dari function hello.

Function yang dipanggil menggunakan defer statement juga akan selalu dijalankan meskipun terjadi error. Berikut ini contohnya:

package main

import "fmt"

func hello() {
	fmt.Println("Hello World!")
}

func main() {
	defer hello()

	div := 0 // pembagi 0 biar error
	result := 3/div

	fmt.Println(result)
}

output:

Hello World!
panic: runtime error: integer divide by zero

goroutine 1 [running]:
main.main()
        D:/golang/seri-belajar-folang/defer.go:13 +0x3b
exit status 2

Dari contoh tersebut kamu bisa melihat bahwa text “Hello World!” tetap tercetak walaupun terjadi error yang disebabkan pembagian menggunakan nol.

Panic

Panic adalah sebuah function yang digunakan untuk menghentikan program. Panic function biasanya akan terpanggil saat terjadi error pada program kita. Contohnya seperti error yang sengaja kita buat pada contoh defer, terdapat keyword “panic” pada pesan error yang muncul.

Panic function juga bisa kita panggil secara manual. Hal ini akan berguna misalnya ketika kita melakukan pengecekan terhadap suatu kondisi. Ketika panic function dipanggil, function yang menggunakan statement defer akan tetap dijalankan meskipun program dihentikan.

Berikut ini adalah contoh panic function:

package main

import "fmt"

func hello() {
	fmt.Println("Hello World!")
}

func main() {
	// kode ini akan tetap dieksekusi
	defer hello()

	// meskipun kita memanggil panic function
	panic("Panic dipanggil")

	// sedangkan kode ini tidak akan dieksekusi, karena program berhenti
	// setelah panic function dipanggil
	fmt.Println("Tidak akan dieksekusi")
}

output:

Hello World!
panic: Panic dipanggil

goroutine 1 [running]:
main.main()
        D:/golang/seri-belajar-folang/panic.go:14 +0x49
exit status 2

Recover

Recover adalah sebuah function yang berfungsi untuk menangkap data dari panic function. Recover function memiliki kegunaan yang hampir sama seperti catch pada bahasa pemrogramman lain. Recover digunakan untuk mencegah program terhenti karena terjadi “panic”.

Berikut ini contoh recover function:

package main

import "fmt"

func checkSudahMakan(sudahMakan bool) {
	if sudahMakan == false {
		panic("Ups, kamu belum makan")
	}

	fmt.Println("Mantap, sudah makan")
}

func selesai() {
	er := recover()

	if er != nil {
		fmt.Println("Ada eror:", er)
	}

	fmt.Println("Selesai")
}

func main() {
	defer selesai()
	checkSudahMakan(false)
}

output:

Ada eror: Ups, kamu belum makan
Selesai

Dari contoh tersebut, kamu bisa melihat bahwa kode program kita tidak terhenti karena terjadi “panic”, tetapi program akan terus dijalankan dengan menampilkan pesan eror seperti pesan biasa.

Konsep penggunaan recover ini mirip seperti block try-catch di dalam bahasa pemrograman lainnya.

Contoh di javascript:

try {
  // kode
} catch (error) {
  console.error("ada error: " + error);
}

Berikutnya: #30: Struct

Bagikan:

Ingin Berdiskusi?

Yuk bergabung di Grup Telegram Ruang Developer atau mulai diskusi melalui GitHub. See You!

Dapatkan contoh source code project backend, frontend, atau fullstack untuk kamu amati, tiru, dan modifikasi sesuka hati. Klik untuk melihat detail!
comments powered by Disqus

Berlangganan Gratis

Kamu akan menerima email update dari Ruang Developer

Beri Dukungan

Beri dukungan, dapatkan full source code project web untuk bahan referensi, tiru, dan modifikasi.
Lightbox