Mengapa Go Tidak Memiliki Try-Catch?
Go secara sengaja tidak mendukung try-catch, melainkan hanya mendukung sintaks panic-recover. Hal ini memicu keluhan dari banyak pengembang yang terbiasa dengan penanganan kesalahan menggunakan try-catch. Lalu, mengapa try-catch tidak dimasukkan? Itu karena try-catch memiliki beberapa masalah.
try-catch-finally
Konstruksi try-catch adalah sintaks untuk menangani situasi kesalahan dan pengecualian yang dapat terjadi selama eksekusi program (runtime). Selain itu, konstruksi finally digunakan untuk menulis kode yang harus dieksekusi tanpa syarat, 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 untuk menulis ke floppy disk', dan pengembang pada masa itu akan melempar (throw) kesalahan tersebut ke titik penanganan kesalahan untuk diproses secara terpusat ketika terjadi kesalahan. Dalam situasi ini, konstruksi try-catch bekerja secara efisien.
Namun, seiring berjalannya waktu, situasinya berubah. Logika bisnis menjadi lebih kompleks, database dan transaksi muncul, dan banyak API dipanggil melalui jaringan, sehingga banyak pesan permintaan harus diuraikan, bahkan dengan munculnya pemrograman konkuren, kesalahan harus ditangani di thread lain selain thread utama.
Kesalahan menjadi sangat kompleks sehingga tidak dapat lagi ditangani di satu tempat, dan tidak ada satu pihak pun yang dapat bertanggung jawab atas semua kesalahan. Di sinilah masalah serius muncul dengan try-catch.
Pengalihan Tanggung Jawab try-catch
Try-catch, sederhananya, adalah cara bagi pihak yang memicu kesalahan untuk mengalihkan tanggung jawab (penanganan) atas terjadinya kesalahan kepada orang lain. Target pengalihan tersebut bisa berupa konstruksi catch, metode induknya, induk dari induknya, dan seterusnya. Dengan kata lain, di dunia di mana penanganan kesalahan menjadi lebih banyak dan kompleks, metode yang dipilih try-catch adalah 'biar orang lain saja yang melakukannya'. Perhatikan 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 e.printStackTrace();
8}
Masalah dengan kode di atas adalah tidak jelas siapa pihak yang menangani printStackTrace, dan tidak jelas kode mana yang menyebabkan kesalahan. Bahkan, semakin banyak logika yang ada di dalam pernyataan try, masalahnya akan semakin mengerikan. Namun, ironisnya, semakin kompleks pengembangan, pengembang menjadi semakin kecanduan dengan konstruksi try-catch yang mengalihkan tanggung jawab, tidak memikirkan penanganan kesalahan, kesadaran akan tanggung jawab juga memudar, dan pada akhirnya, mereka lupa tentang esensi dari kesalahan dan penanganan pengecualian. Lalu, bagaimana golang menyelesaikan masalah ini?
panic, recover
Salah satu keunggulan go adalah adanya berbagai sistem yang tidak menjerumuskan pengembang ke jalan yang salah, melainkan membuat mereka menjadi pengembang yang baik. panic - recover juga bisa menjadi contohnya. Sekilas, panic dan recover tidak terlihat berbeda dari try-catch, tetapi perbedaannya terletak pada fakta bahwa ketika masalah terjadi, tanggung jawab tidak dialihkan ke pihak luar. Ketika panic terjadi di go, nilai tersebut tidak dialihkan ke luar, melainkan harus diselesaikan di lokasi terjadinya panic. Hal ini memberi pengembang tanggung jawab atas penanganan kesalahan dan mendorong mereka untuk berpikir lebih dalam tentang di mana, siapa, dan bagaimana kesalahan tersebut harus ditangani. Ini berarti memberikan otonomi kepada pengguna, namun tetap menyisakan ruang untuk berpikir.
Selain itu, pemilihan kata panic juga sangat baik, tidak seperti try-recover, panic-recover memberikan tekanan kepada pengembang melalui kata-kata itu sendiri bahwa itu hanya boleh digunakan dalam situasi kesalahan yang jelas, bukan situasi pengecualian. Secara alami, pengembang tidak akan menyalahgunakan recover dan hanya akan menggunakannya di tempat yang diperlukan. Hal ini sangat membantu dalam menulis kode yang ringkas di go.