Обработка ошибок в Perl
Обработка ошибок в Perl - это процесс принятия соответствующих мер в отношении программы, которая вызывает трудности при выполнении из-за некоторой ошибки в коде или компиляторе. Процессы подвержены ошибкам. Например, если при открытии несуществующего файла возникает ошибка, а при доступе к не объявленной переменной возникает ошибка.
Программа остановится, если произойдет ошибка, и, таким образом, используя обработку ошибок, мы можем предпринять соответствующие действия вместо того, чтобы полностью останавливать программу. Обработка ошибок - основное требование для любого языка, подверженного ошибкам.
Ошибки можно классифицировать по времени их возникновения:
- Ошибки времени компиляции
- Время выполнения Erros
Ошибка времени компиляции: это ошибка, такая как синтаксическая ошибка или отсутствие ссылки на файл, которая препятствует успешной компиляции программы.
Ошибка времени выполнения: это ошибка, которая возникает во время работы программы, и эти ошибки обычно являются логическими ошибками, которые приводят к неправильному выводу.
Обработка ошибок в Perl
Perl предоставляет две встроенные функции для генерации фатальных исключений и предупреждений, а именно:
- ()
- предупреждать ()
die (): сигнализировать о возникновении фатальных ошибок в том смысле, что выполнение рассматриваемой программы не должно продолжаться.
For example, accessing a file with open() tells if the open operation is successful before proceeding to other file operations.
open FILE, "filname.txt" or die "Cannot open file: $! ";
Note: $! is a predefined variable that returns the error message returned by the system on the error.
warn() : Unlike die() function, warn() generates a warning instead of a fatal exception.
Например:
открыть ФАЙЛ, "filname.txt" или предупредить "Невозможно открыть файл: $! n";
Другие методы, которые можно использовать для обработки ошибок
- если заявление
- если функция
- Ошибка модуля ": попробуйте"
The if statement: The statements in a code block will be executed only if the condition holds true.
if(-e $filename)){ print "File exists"; } else { die "Cannot open the file. $!"} |
unless function : The statements in the code block will only be executed if the expression returns false.
unless(-e $filename) { die "File Does not Exist! $!";} |
Ошибка ': try': похожа на блок try and catch, как в языке программирования Java.
use Error ":try"; try{ open FILE, "filename.txt" or die "File cannot be opened: $!"; while () { # Do something } close FILE;} catch Error::Simple with { my $err = shift; print "ERROR: $err";}; |
Ошибка в модулях
До сих пор мы видели, как Perl обрабатывает ошибки и сообщает об ошибках программисту, но что, если в модуле произошла ошибка, о которой нужно сообщить программисту? Такие ошибки вызовут трудности в выполнении всех тех кодов, которые импортируют этот конкретный модуль.
For example, you make a module let’s say test.pm, and we are doing a wrong calculation, so an error message will be thrown as shown below:
package test;sub functionName{ warn "Error in module!"}1; |
use test; functionName();
Выход:
Ошибка в модуле! в test.pm строка 6
This error handling technique can be used by the programmers to rectify all the errors in the module. Carp module() can be used to provide methods for reporting errors within modules.
The Carp Module
It is alternative to warn and die for modules. It is useful for user-defined modules because they act somewhat like die() and warn(), but with a message which is added by the programmer.
This Carp module provides some functions which are:
- carp()
- cluck()
- croak()
- confess()
carp() function: This function works similar to warn function and prints the message given by the user without exiting the script.
Example:
package test;use Carp; sub functionName{ carp "Error in module!"}1; |
use test; functionName();
Выход:
Ошибка в модуле! в test.pm строка 8
cluck() function: This function produces a context which is a summary of every call in the call-stack. It follows the same process as the carp() function does but it prints a stack of all the modules that led to the call to the specific function.
Example:
package Test;use Carp qw(cluck); sub function_name { cluck "Error in module!";}1; |
use Test; function_name();
Выход:
Ошибка в модуле! в Test.pm строка 5 Test :: function_name () вызывается в строке 2 test.pl
croak() function: This function is similar to die() function, except that it produces a shorter message which reports the error as being from where your module was called.
Example:
package Test;use carp; sub functionName { croak "Error in module!";}1; |
use Test; functionName();
Выход:
Ошибка в модуле! в test.pl строка 2
confess() function: This function is similar to cluck() function. It calls the die function and then prints a stack of all the modules that led to the call to the specific function.
Example:
package Test;use Carp; sub functionName { confess "Error in module!";}1; |
use Test; functionName();
Выход:
Ошибка в модуле! в Test.pm строка 5 Test :: functionName () вызывается в строке 2 test.pl