GoSuda

Mengapa Go tidak memiliki Try-Catch?

By Rabbit Princess
views ...

Go secara sengaja tidak mendukung try-catch dan hanya mendukung sintaks panic-recover. Hal ini menyebabkan banyak pengembang yang terbiasa dengan penanganan kesalahan menggunakan try-catch mengeluh. Lalu, mengapa try-catch tidak disertakan? Alasannya adalah karena try-catch memiliki beberapa masalah.

try-catch-finally

Konstruksi try-catch adalah sintaksis untuk menangani situasi kesalahan dan pengecualian yang mungkin terjadi selama eksekusi program (runtime). Selain itu, konstruksi finally berisi kode yang harus dieksekusi terlepas dari apakah pengecualian terjadi atau tidak.

Penanganan Kesalahan dan Tanggung Jawab

Pada tahun 80-an dan 90-an, penanganan kesalahan sangat sederhana. Pesan kesalahan hanya berupa 'Floppy disk penuh', 'Tidak ada floppy disk di drive', 'Tidak ada izin tulis floppy disk', dan para pengembang saat itu akan melemparkan (throw) kesalahan tersebut hingga ke titik penanganan kesalahan untuk penanganan yang terstandardisasi. Dalam situasi seperti itu, konstruksi try-catch berfungsi secara efisien.

Namun, seiring berjalannya waktu, situasi berubah. Logika bisnis menjadi lebih kompleks, basis data dan transaksi muncul, banyak API harus dipanggil melalui jaringan dan banyak pesan permintaan harus diinterpretasikan, bahkan dengan munculnya pemrograman konkuren, kesalahan harus ditangani di thread selain thread utama.

Kesalahan menjadi terlalu kompleks untuk ditangani di satu tempat, dan tidak ada satu pun entitas yang dapat bertanggung jawab atas semua kesalahan. Di sinilah masalah serius muncul dengan try-catch.

Pengalihan Tanggung Jawab try-catch

try-catch, singkatnya, adalah metode di mana entitas yang menyebabkan kesalahan mengalihkan tanggung jawab (penanganan pasca-kesalahan) kepada seseorang. Entitas yang dialihkan bisa berupa klausa catch, metode induknya, atau induk dari induk dari induk dari induknya... seseorang. Dengan kata lain, di dunia di mana penanganan kesalahan menjadi lebih banyak dan kompleks, metode yang dipilih try-catch adalah 'seseorang akan menanganinya'. Mari kita lihat kode di bawah ini.

1try {
2    data = readFile("hello.txt");
3    structuredData = parseData(data);
4    insertDBStatus(structuredData[1]);
5    startHTTPServer(structuredData[2]);
6} catch (Exception e) {
7    // Mencetak jejak tumpukan (stack trace) dari pengecualian
8    e.printStackTrace();
9}

Masalah dengan kode di atas adalah tidak jelas siapa yang menangani printStackTrace, dan tidak mungkin untuk mengetahui di bagian kode mana kesalahan terjadi. Bahkan, semakin banyak logika dalam pernyataan try, masalahnya menjadi semakin mengerikan. Namun, ironisnya, semakin kompleks pengembangan, semakin banyak pengembang yang menjadi kecanduan konstruksi try-catch yang mengalihkan tanggung jawab, tidak memikirkan penanganan kesalahan, tanggung jawab mereka berkurang, dan pada akhirnya mereka melupakan esensi penanganan kesalahan dan pengecualian. Lalu, bagaimana golang menyelesaikan masalah ini?

panic, recover

Salah satu keuntungan Go adalah ia memiliki berbagai sistem untuk membentuk pengembang menjadi pengembang yang baik, bukan membiarkan mereka tersesat. panic-recover juga dapat diambil sebagai contoh. ​ Panic dan recover sekilas terlihat tidak berbeda dari try-catch, tetapi berbeda dalam hal tidak mengalihkan tanggung jawab ke luar ketika masalah terjadi. Ketika panic terjadi di Go, nilai tersebut harus diselesaikan di lokasi panic, bukan dialihkan ke luar. Ini memberikan tanggung jawab penanganan kesalahan kepada pengembang, mendorong mereka untuk merenungkan lebih dalam di mana, siapa, dan bagaimana kesalahan tersebut harus ditangani. Ini menjamin otonomi pengguna sambil memberikan ruang untuk berpikir.

Selain itu, pemilihan kata "panic" juga sangat baik; tidak seperti try-recover, panic-recover memberikan tekanan kepada pengembang untuk hanya menggunakannya dalam situasi kesalahan yang jelas, bukan situasi pengecualian, hanya dengan kata itu sendiri. Secara alami, pengembang tidak menyalahgunakan recover dan hanya menggunakannya di tempat yang diperlukan. Ini sangat membantu dalam menulis kode yang ringkas di Go.