Erlang - Pengecualian
Penanganan pengecualian diperlukan dalam bahasa pemrograman apa pun untuk menangani error runtime sehingga aliran normal aplikasi dapat dipertahankan. Exception biasanya mengganggu aliran normal aplikasi, itulah alasan mengapa kita perlu menggunakan penanganan Exception dalam aplikasi kita.
Biasanya ketika pengecualian atau kesalahan terjadi di Erlang, pesan berikut akan ditampilkan.
{"init terminating in do_boot", {undef,[{helloworld,start,[],[]},
{init,start_it,1,[]},{init,start_em,1,[]}]}}
Crash dump akan ditulis ke -
erl_crash.dump
init terminating in do_boot ()
Di Erlang, ada 3 jenis pengecualian -
Error - Menelepon erlang:error(Reason)akan mengakhiri eksekusi dalam proses saat ini dan menyertakan jejak tumpukan dari fungsi terakhir yang dipanggil dengan argumennya saat Anda menangkapnya. Ini adalah jenis pengecualian yang memicu error runtime di atas.
Exists- Ada dua jenis jalan keluar: keluar 'internal' dan keluar 'eksternal'. Keluar internal dipicu dengan memanggil fungsi tersebutexit/1dan membuat proses saat ini menghentikan eksekusinya. Pintu keluar eksternal disebut denganexit/2 dan harus dilakukan dengan banyak proses dalam aspek bersamaan dari Erlang.
Throw- Throw adalah kelas pengecualian yang digunakan untuk kasus-kasus yang diharapkan dapat ditangani oleh programmer. Dibandingkan dengan keluar dan kesalahan, mereka tidak benar-benar membawa 'proses crash itu!' niat di belakang mereka, melainkan mereka mengontrol arus. Saat Anda menggunakan lemparan sambil mengharapkan programmer untuk menanganinya, biasanya ide yang baik untuk mendokumentasikan penggunaannya dalam modul yang menggunakannya.
SEBUAH try ... catch adalah cara untuk mengevaluasi ekspresi sambil membiarkan Anda menangani kasus yang berhasil serta kesalahan yang ditemukan.
Sintaks umum ekspresi coba tangkap adalah sebagai berikut.
Sintaksis
try Expression of
SuccessfulPattern1 [Guards] ->
Expression1;
SuccessfulPattern2 [Guards] ->
Expression2
catch
TypeOfError:ExceptionPattern1 ->
Expression3;
TypeOfError:ExceptionPattern2 ->
Expression4
end
Ekspresi di antaranya try and ofdikatakan dilindungi. Ini berarti bahwa segala jenis pengecualian yang terjadi dalam panggilan itu akan ditangkap. Pola dan ekspresi di antaratry ... of and catch berperilaku persis sama dengan a case ... of.
Akhirnya, bagian tangkapan - di sini, Anda dapat mengganti TypeOfErrordengan kesalahan, melempar atau keluar, untuk masing-masing jenis yang telah kita lihat di bab ini. Jika tidak ada tipe yang disediakan, diasumsikan lemparan.
Berikut adalah beberapa kesalahan dan alasan kesalahan di Erlang -
Kesalahan | Jenis Kesalahan |
---|---|
badarg | Argumen yang buruk. Argumennya adalah tipe data yang salah, atau formatnya salah. |
badarith | Argumen buruk dalam ekspresi aritmatika. |
{badmatch, V} | Evaluasi ekspresi kecocokan gagal. Nilai V tidak cocok. |
function_clause | Klausa fungsi yang cocok tidak ditemukan saat mengevaluasi panggilan fungsi. |
{case_clause, V} | Tidak ada cabang yang cocok ditemukan saat mengevaluasi ekspresi kasus. Nilai V tidak cocok. |
if_clause | Tidak ada cabang yang benar ditemukan saat mengevaluasi ekspresi if. |
{try_clause, V} | Tidak ada cabang yang cocok ditemukan saat mengevaluasi bagian-of dari ekspresi percobaan. Nilai V tidak cocok. |
undef | Fungsi tidak dapat ditemukan saat mengevaluasi panggilan fungsi .. |
{badfun, F} | Ada yang salah dengan F yang menyenangkan |
{badarity, F} | Kegembiraan diterapkan pada jumlah argumen yang salah. F menggambarkan kesenangan dan argumennya. |
timeout_value | Nilai batas waktu dalam ekspresi accept..after dievaluasi ke sesuatu selain integer atau infinity. |
noproc | Mencoba menautkan ke proses yang tidak ada. |
Berikut adalah contoh bagaimana pengecualian ini dapat digunakan dan bagaimana sesuatu dilakukan.
Fungsi pertama menghasilkan semua kemungkinan jenis pengecualian.
Kemudian kita menulis fungsi pembungkus untuk dipanggil generate_exception mencoba ... menangkap ekspresi.
Contoh
-module(helloworld).
-compile(export_all).
generate_exception(1) -> a;
generate_exception(2) -> throw(a);
generate_exception(3) -> exit(a);
generate_exception(4) -> {'EXIT', a};
generate_exception(5) -> erlang:error(a).
demo1() ->
[catcher(I) || I <- [1,2,3,4,5]].
catcher(N) ->
try generate_exception(N) of
Val -> {N, normal, Val}
catch
throw:X -> {N, caught, thrown, X};
exit:X -> {N, caught, exited, X};
error:X -> {N, caught, error, X}
end.
demo2() ->
[{I, (catch generate_exception(I))} || I <- [1,2,3,4,5]].
demo3() ->
try generate_exception(5)
catch
error:X ->
{X, erlang:get_stacktrace()}
end.
lookup(N) ->
case(N) of
1 -> {'EXIT', a};
2 -> exit(a)
end.
Jika kita menjalankan program sebagai helloworld: demo (). , kita akan mendapatkan output berikut -
Keluaran
[{1,normal,a},
{2,caught,thrown,a},
{3,caught,exited,a},
{4,normal,{'EXIT',a}},
{5,caught,error,a}]