Perl - Penanganan Error

Eksekusi dan kesalahan selalu berjalan bersamaan. Jika Anda membuka file yang tidak ada. kemudian jika Anda tidak menangani situasi ini dengan baik maka program Anda dianggap berkualitas buruk.

Program berhenti jika terjadi kesalahan. Jadi penanganan kesalahan yang tepat digunakan untuk menangani berbagai jenis kesalahan, yang mungkin terjadi selama eksekusi program dan mengambil tindakan yang tepat alih-alih menghentikan program sepenuhnya.

Anda dapat mengidentifikasi dan menjebak kesalahan dengan berbagai cara. Sangat mudah untuk menjebak kesalahan di Perl dan kemudian menanganinya dengan benar. Berikut adalah beberapa metode yang dapat digunakan.

Pernyataan if

Itu if statementadalah pilihan yang jelas ketika Anda perlu memeriksa nilai pengembalian dari sebuah pernyataan; misalnya -

if(open(DATA, $file)) { ... } else { die "Error: Couldn't open the file - $!";
}

Berikut variabel $! mengembalikan pesan kesalahan yang sebenarnya. Sebagai alternatif, kita dapat mengurangi pernyataan menjadi satu baris dalam situasi yang masuk akal untuk dilakukan; misalnya -

open(DATA, $file) || die "Error: Couldn't open the file $!";

Fungsi kecuali

Itu unlessFungsi adalah kebalikan logis dari pernyataan if: dapat sepenuhnya melewati status sukses dan hanya dijalankan jika ekspresi kembali salah. Misalnya -

unless(chdir("/etc")) {
   die "Error: Can't change directory - $!";
}

Itu unlessPernyataan paling baik digunakan ketika Anda ingin memunculkan kesalahan atau alternatif hanya jika ekspresi gagal. Pernyataan itu juga masuk akal bila digunakan dalam pernyataan satu baris -

die "Error: Can't change directory!: $!" unless(chdir("/etc"));

Di sini kita mati hanya jika operasi chdir gagal, dan terbaca dengan baik.

Operator terner

Untuk pengujian yang sangat singkat, Anda dapat menggunakan operator bersyarat ?:

print(exists($hash{value}) ? 'There' : 'Missing',"\n");

Tidak begitu jelas di sini apa yang kami coba capai, tetapi efeknya sama dengan menggunakan file if atau unlesspernyataan. Operator bersyarat paling baik digunakan saat Anda ingin mengembalikan salah satu dari dua nilai dengan cepat dalam ekspresi atau pernyataan.

Fungsi peringatan

Fungsi peringatan hanya memunculkan peringatan, sebuah pesan dicetak ke STDERR, tetapi tidak ada tindakan lebih lanjut yang diambil. Jadi akan lebih berguna jika Anda hanya ingin mencetak peringatan untuk pengguna dan melanjutkan operasi lainnya -

chdir('/etc') or warn "Can't change directory";

Fungsi die

Fungsi die bekerja seperti warn, kecuali itu juga memanggil exit. Dalam skrip normal, fungsi ini memiliki efek untuk segera menghentikan eksekusi. Anda harus menggunakan fungsi ini jika tidak ada gunanya melanjutkan jika ada kesalahan dalam program -

chdir('/etc') or die "Can't change directory";

Kesalahan dalam Modul

Ada dua situasi berbeda yang harus kami tangani -

  • Melaporkan kesalahan dalam modul yang mengutip nama file dan nomor baris modul - ini berguna saat men-debug modul, atau saat Anda secara khusus ingin memunculkan kesalahan terkait modul, bukan terkait skrip.

  • Melaporkan kesalahan dalam modul yang mengutip informasi pemanggil sehingga Anda dapat men-debug baris dalam skrip yang menyebabkan kesalahan. Kesalahan yang muncul dengan cara ini berguna bagi pengguna akhir, karena kesalahan tersebut menyoroti kesalahan dalam kaitannya dengan baris asal skrip pemanggil.

Itu warn dan diefungsi bekerja sedikit berbeda dari yang Anda harapkan saat dipanggil dari dalam modul. Misalnya, modul sederhana -

package T;

require Exporter;
@ISA = qw/Exporter/;
@EXPORT = qw/function/;
use Carp;

sub function {
   warn "Error in module!";
}
1;

Ketika dipanggil dari skrip seperti di bawah ini -

use T;
function();

Ini akan menghasilkan hasil sebagai berikut -

Error in module! at T.pm line 9.

Ini kurang lebih seperti yang Anda harapkan, tetapi belum tentu seperti yang Anda inginkan. Dari perspektif pemrogram modul, informasi ini berguna karena membantu menunjukkan bug di dalam modul itu sendiri. Untuk pengguna akhir, informasi yang diberikan cukup tidak berguna, dan untuk semua kecuali programmer yang tangguh, itu sama sekali tidak berguna.

Solusi untuk masalah tersebut adalah modul Carp, yang menyediakan metode yang disederhanakan untuk melaporkan kesalahan dalam modul yang mengembalikan informasi tentang skrip pemanggil. Modul Carp menyediakan empat fungsi: carp, cluck, croak, dan confess. Fungsi-fungsi ini dibahas di bawah.

Fungsi Ikan Mas

Fungsi ikan mas adalah padanan dasar dari memperingatkan dan mencetak pesan ke STDERR tanpa benar-benar keluar dari skrip dan mencetak nama skrip.

package T;

require Exporter;
@ISA = qw/Exporter/;
@EXPORT = qw/function/;
use Carp;

sub function {
   carp "Error in module!";
}
1;

Ketika dipanggil dari skrip seperti di bawah ini -

use T;
function();

Ini akan menghasilkan hasil sebagai berikut -

Error in module! at test.pl line 4

Fungsi keok

Fungsi cluck adalah semacam ikan mas supercharged, mengikuti prinsip dasar yang sama tetapi juga mencetak jejak tumpukan semua modul yang mengarah ke fungsi yang dipanggil, termasuk informasi pada skrip asli.

package T;

require Exporter;
@ISA = qw/Exporter/;
@EXPORT = qw/function/;
use Carp qw(cluck);

sub function {
   cluck "Error in module!";
}
1;

Ketika dipanggil dari skrip seperti di bawah ini -

use T;
function();

Ini akan menghasilkan hasil sebagai berikut -

Error in module! at T.pm line 9
   T::function() called at test.pl line 4

Fungsi parauak

Itu croak fungsi setara dengan die, kecuali bahwa itu melaporkan penelepon satu level ke atas. Seperti die, fungsi ini juga keluar dari skrip setelah melaporkan kesalahan ke STDERR -

package T;

require Exporter;
@ISA = qw/Exporter/;
@EXPORT = qw/function/;
use Carp;

sub function {
   croak "Error in module!";
}
1;

Ketika dipanggil dari skrip seperti di bawah ini -

use T;
function();

Ini akan menghasilkan hasil sebagai berikut -

Error in module! at test.pl line 4

Seperti halnya ikan mas, aturan dasar yang sama berlaku mengenai penyertaan informasi baris dan file menurut fungsi peringatan dan mati.

Fungsi pengakuan

Itu confess fungsinya seperti cluck; itu memanggil mati dan kemudian mencetak jejak tumpukan sampai ke skrip origination.

package T;

require Exporter;
@ISA = qw/Exporter/;
@EXPORT = qw/function/;
use Carp;

sub function {
   confess "Error in module!";
}
1;

Ketika dipanggil dari skrip seperti di bawah ini -

use T;
function();

Ini akan menghasilkan hasil sebagai berikut -

Error in module! at T.pm line 9
   T::function() called at test.pl line 4