Advertisement
  1. Code
  2. Elixir

Cara Menangani Exception di Elixir

by
Read Time:8 minsLanguages:

Indonesian (Bahasa Indonesia) translation by Husain Ali Yahya (you can also view the original English article)

Penanganan exception adalah praktik penting bagi metodologi pengembangan aplikasi apapun. Baik untuk pngembangan berbasis ujicoba, agile sprints, atau sebuah sesi hacking dengan sebuah daftar centang lawas. Kita semua bisa mendapatkan keuntungan dengan memastikan bahwa dasar-dasar kita telah dilingkupi oleh pendekatan yang kuat untuk menangani kecacatan.

Sangat penting untuk memastikan error dapat diatasi, sementara tetap menarik secara estetik dan tentu saja tidak menjadi sebuah masalah besar secara logika dengan pesan-pesan tersembunyi untuk pengguna akhir untuk mencoba dan mengambil makna dari-nya. Jika kamu melakukannya, kamu tentu berada di jalur yang baik dalam membuat sebuah aplikasi yang solid dan stabil yang nyaman digunakan pengguna dan akan direkomendasikan ke yang lainnya.

Idealnya bagi kita, Elixir menyediakan penanganan exception ekstensif melalui beberapa mekanisme seperti try/catch, throws, dan tuple {:error, reason}.

Untuk menampilkan sebuah error, gunakan raise di interactive shell untuk merasakan pengalaman pertama-nya.

Kita juga bisa menambahkan sebuah type seperti ini:

Cara Penanganan Error Bekerja di Elixir

Beberapa cara error ditangani di Elixir mungkin tidak tampak pada pandangan pertama.

  • Pertama mengenai proses-proses - dalam penggunaan spawn, kita bisa membuat proses independen. Ini berarti kegagalan pada sebuah thread harusnya tidak memberi dampak pada proses lainnya, kecuali ada sebuah hubungan dalam suatu cara. Tapi pada dasarnya, semua nya akan tetap stabil.
  • Untuk menotifikasikan sistem-nya mengenai kegagalan salah satu dari proses-proses ini, kita bisa menggunakan macro spawn_link. Dia adalah tautan dua arah, yang berarti jika sebuah proses yang tertaut berhenti, sebuah sinyal exit akan dipicu.
  • Jika sinyal exit-nya bukan :normal, kita tahu bahwa kita memiliki sebuah masalah. dan jika kita trap sinyal exit dengan Process.flag(:trap_exit, true), sinyal exit akan dikirim ke kotak masuk proses-nya di mana logic-nya bisa diletakkan pada cara menangani pesannya sehingga hard crash bisa dihindari.
  • Terakhir, kita memiliki Monitors yang mirip dengan spawn_links, tapi mereka merupakan tautan satu arah dan kita bisa membuat mereka menggunakan Process.monitor.
  • Proses yang memanggil Process.monitor akan menerima pesan error jika gagal.

Untuk contoh error, cobalah masukkan sebuah angka ke sebuah atom dan kamu akan mendapatkan hal berikut:

Untuk memastikan pengguna akhir tidak mendapatkan error, kita bisa menggunakan metode try, catch and rescue yang disediakan oleh Elixir.

Try/Rescue

Yang pertama di kotak peralatan kita untuk menangani exception adalah try/rescue yang akan menangkap error yang diproduksi dengan menggunakan raise sehingga dia sangat cocok untuk error-error pengembang dan keadaan exceptional seperti kesalahan input.

try/rescue memiliki fungsi yang mirip dengan try/catch di bahasa pemograman lainnya. Mari lihat contohnya bekerja:

Di sini kita menggunakan try/rescue dan raise untuk menangkap RuntimeError.

Ini berarti keluaran bawaan ** (RuntimeError) dari raise tidak ditampilkan dan digantikan dengan keluaran yang telah diformat lebih baik dari pemanggilan IO.puts.

Dalam praktik terbaiknya, kamu harus menggunakan pesan error-nya untuk memberikan pengguna sebuah keluaran berguna dalam bahasa Inggris yang akan membantu mereka mengenai masalah-nya. Kita akan melihat lebih dalam di contoh berikutnya.

Banyak Error dalam Sebuah Try/Rescue

Keuntungan utama dari Elixir adalah kamu bisa menangkap banyak keluaran dari salah satu blok try/rescue. Lihat contoh ini:

Di sini kita telah menangkap dua error di dalam rescue.

  1. Jika berkas-nya tidak dapat dibaca.
  2. Jika simbol :source_file menghilang.

Seperti yang disebutkan sebelumnya, kita bisa menggunakan ini untuk membuat pesan yang mudah untuk dipahami untuk pengguna terakhir kita.

Pendekatan sintaks yang bertenaga dan sederhana dari Elixir ini membuat penulisan banyak pengecekan menjadi sangat mudah diakses oleh kita untuk mengecek sebanyak kemungkinan kegagalan yang mungkin secara rapih dan ringkas. Ini membantu kita untuk memastika kita tidak perlu menulis aneka kondi yang panjang dan sulit untuk divisualisasikan maupun di-debug secara tepat saat pengembangan annti-nya atau untuk pengembang baru yang akan bergabung.

Dan selalu, pendekatan KISS adalah yang terbaik saat bekerja dengan Elixir.

After

Ada beberapa situasi di mana kamu akan membutuhkan sebuah aksi spesifik untuk dilakukan setelah try.rescue, tanpa mempertimbangkan apakah ada error atau tidak. Untuk pengembang Java atau PHP, kamu bisa membayangkan try/catch/finally atau begin/rescue/ensure milik Ruby.

Mari perhatikan contoh sederhana dari penggunaan after.

Di sini kamu melihat after digunakan untuk membuat secara tetap sebuah pesan layar (atau ini bisa jadi fungsi apapun yang kamu inginkan).

Praktik yang lebih sering kamu lihat di mana dia digunakan adalah ketika sebuah berkas sedang diakses, di sini contohnya:

Throws

Seperti raise dan try/catch yang telah kita bahas sebelumnya, kita juga memliki macro throw dan catch.

Menggunakan metode throw untuk keluar dari eksekusi dengan sebuah nilai tertentu yang bisa kita cari dari catch dan menggunakannya lebih lanjut seperti ini:

Jadi di sini kita memiliki kemapuan untuk catch semua yang kita throw ke dalam blok try. Pada kasus ini, pengandaian if x == 3 adalah pemicu dari do; throw(x)

Keluaran dari iterasi yang diproduksi pengulangannya memberikan kita sebuah pemahaman jelas dari apa yang telah terjadi secara programatis. Secara inkremental kita telah melangkah ke depan dan eksekusi telah dihentikan pada catch.

Karen fungsionalitas ini, terkadang bisa jadi sulit untuk menangkap di mana throw catch akan diimplementasikan pada aplikasimu. Satu lokasi utama bisa jadi di penggunaan sebuah pustaka di mana API-nya tidak memiliki fungsionalitas yang cukup untuk semua hasil yang dihadirkan ke pengguna, dan sebuah catch bisa jadi cukup untuk secara cepat menyelesaikan masalhnya ketimbang harus mengembangkan lebih banyak hal dengan pustaka-nya untuk menangani masalahnya.

Exits

Yang terakhir di gudang senjata penanganan error Elixir adalah exit. Keluar tidak dilakukan melalui toko hadiah, melainkan terjadi secara eksplisit kapanpun sebuah proses mati.

Exits diisyaratkan sebagai berikut:

Isyarat exit dipicur oleh proses-proses karena salah satu dari tiga alasan berikut:

  1. Exit normal. Ini terjadi ketika sebuah proses telah menyelesaikan pekerjaan dan mengakhiri eksekusi. Karena exit macam ini memang normal, biasanya tidak ada yang perlu dilakukan ketika ini terjadi, sangat mirip dengan exit(0) di C. Alasan exit untuk exit macam ini adalah atom :normal.
  2. Karena error yang tidak ditangani: Ini terjadi ketika sebuah uncaught exception muncul di dalam proses-nya tanpa blok try/catch/rescue atau throw/catch untuk menanganinya.
  3. Dimatikan secara paksa: Ini terjadi ketika proses lainnya mengirim pesan exit dengan alasan :kill yang memaksa proses yang menerimanya utuk berhenti.

Stack Traces

Pada titik waktu pembaharuan apapun pada pemanggilan throw, exit, atau errors System.stacktrace akan mengembalikan kejadian terakhir pada proses saat ini.

Stack tace bisa diformat sedikit, namun dia akan berubah pada versi Elixir yang lebih baru. Untuk informasi lebih lanjut mengena ini, tolong mengacu ke manual page -nya.

Untuk mengembalikan stack trace dari proses saat ini, kamu bisa menggunakan yang berikut ini:

Membuat Error-mu Sendiri

Ya, Elixir bisa melakukannya juga. Tentu saja, kamu selalu bisa memiliki tipe-tipe bawaan seperti RuntimeError di pembuanganmu. Tapi bukankah akan jadi bagus jika kamu melangkah lebih jauh?

Membuat error-mu sendiri sangat mudah dengan menggunakan macro defexception yang akan menerima opsi :message, berikut cara mengatur sebuah pesan error default:

Ini adalah car menggunakannya di program-mu:

Kesimpulan

Penanganan error di bahasa pemograman meta seperti Elixir memiliki setumpuk implikasi potensial mengenai bagaimana kita mendesain aplikasi kita dan membuat mereka cukup kuat lingkungan produksi yang keras.

Kita selalu bisa memastikan pengguna akhir selalu ditinggal dengan sebuah petunjuk - pesan sederhana dan mudah untuk dipahami. Yang tidak akan membuat tugas sulit namun sebaliknya. Pesan error harus selalu ditulis dalam bahasa Inggris dan memberikan banyak informasi. Kode error cryptic dan nama-nama variabel tidak bagus untuk pengguna pada umumnya dan bahkan bisa membingungkan pengembang!

Lebih jauh lagi, kamu bisa memonitor exception yang muncul di aplikasi Elixir dengan mengatur riwayat spesifik untuk titik-titik masalah tertentu sehingga kamu bisa menganalisan dan merencanakan perbaikan atau kamu bisa menggunakan solusi yang sudah ada.

Layanan Pihak Ketiga

Tingkatkan akurasi dari kerja debuggin dan aktifkan monitoring untuk kestabilan aplikasimu dengan layanan pihak ketiga yang tersedia untuk Elixir:

  • AppSignal bisa jadi sangat bermanfaat untuk fase penjagaan kualitas dari siklus pengembangannya.
  • Repo GitHub bugsnex adalah proyek yang bagus untuk menggunakan antaramuka API dengan Bugsnag untuk mendeteksi kecacatan lebih jauh di aplikasi Elixir-mu.
  • Monitor waktu berjalan, RAM sistem dan error dengan Honeybadger yang menyediakan monitoring error produksi sehingga kamu tidak perlu menjaga aplikasimu.

Memperluas Penanganan Error Lebih Jauh

Lebih jauh lagi, kamu mungkin ingin untuk memperluas kemampuan penanganan error dari aplikasimu dan membuat kodemu lebih mudah untuk dibaca. Untuknya, saya merekomendasikan kamu mengecek proyek untuk penanganan error elegan di Github ini.

Saya harap kamu mendapatkan pencerahan lebih kauh dari panduan ini dan bisa secara praktik menangani kasus exception apaun yang kamu butuhkan di aplikasi Elixir-mu sekarang!

Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.