Во время работы программы всегда будут возникать различные ошибки, например, открытие несуществующего файла.
Если во время работы программы произойдет ошибка, она остановится. Нам необходимо использовать некоторые методы обнаружения, чтобы избежать ошибок и предотвратить выход из программы.
Perl предоставляет несколько методов обработки ошибок, и далее мы представим их один за другим.
Оператор if может определить возвращаемое значение оператора. Примеры:
if(open(DATA, $file)){ ...}else{ die "Ошибка: невозможно открыть файл - $!";}
Переменная $! в программе вернула сообщение об ошибке. Мы также можем упростить приведенный выше код до следующего кода:
open(DATA, $file) || die "Ошибка: невозможно открыть файл - $!";
Функция if является противоположностью if и будет выполняться только тогда, когда выражение возвращает false, как показано ниже:
if(chdir("/etc")){ die "Ошибка: невозможно открыть каталог - $!";}
Оператор if очень полезен, когда вы хотите установить напоминание об ошибке. Мы также можем сократить приведенный выше код так:
die "Ошибка: невозможно открыть каталог!: $ if(chdir("/etc"));
Вышеупомянутое сообщение об ошибке будет выводиться только в случае ошибки при переключении каталогов.
Ниже приведен простой пример тернарного оператора:
print(exists($hash{value}) ? 'Существует': 'Не существует',"n");
В приведенном выше примере мы использовали тернарный оператор, чтобы определить, существует ли хеш-значение.
В примере содержится выражение с двумя значениями в формате: значение выражения одно: значение два .
Функция предупреждения используется для выдачи предупреждающего сообщения. Никакие другие операции выполняться не будут. Оно выводится в STDERR (стандартный выходной файл). Обычно оно используется для запроса пользователя:
chdir('/etc') или предупреждение «Невозможно переключить каталоги»;
Функция die аналогична предупреждению, но завершает работу. Обычно используется для вывода сообщений об ошибках:
chdir('/etc') или die «Невозможно переключить каталоги»;
В сценариях Perl обычным способом сообщения об ошибках является использование функций alert() или die() для сообщения или генерации ошибок. Для модуля Carp это может обеспечить дополнительный уровень контроля над генерируемыми сообщениями, особенно внутри модуля.
Стандартный модуль Carp предоставляет альтернативы функциям alert() и die(), которые более информативны и удобны для локализации ошибок. При использовании внутри модуля имя модуля и номер строки включаются в сообщение об ошибке.
Функция carp может выводить информацию о трассировке программы, аналогично функции alert, и обычно отправляет эту информацию в STDERR:
package T;require Exporter;@ISA = qw/Exporter/;@EXPORT = qw/function/;use Carp;sub function { carp "Ошибка в модуле!";}1;
Вызовите в скрипте следующую программу:
используйте Т;функция();
Выполняя вышеуказанную программу, результат вывода:
Ошибка в модуле test.pl, строка 4.
cluck() аналогичен alert() и обеспечивает обратную трассировку стека, откуда произошла ошибка.
package T;require Exporter;@ISA = qw/Exporter/;@EXPORT = qw/function/;use Carp qw(cluck);sub function { cluck "Ошибка в модуле!";}1;
Вызовите в скрипте следующую программу:
используйте Т;функция();
Выполняя вышеуказанную программу, результат вывода:
Ошибка в модуле! T.pm, строка 9. T::function() вызывается в test.pl, строка 4.
croak(), как и die(), завершает скрипт.
package T;require Exporter;@ISA = qw/Exporter/;@EXPORT = qw/function/;use Carp;sub function { кваканье "Ошибка в модуле!";}1;
Вызовите в скрипте следующую программу:
используйте Т;функция();
Выполняя вышеуказанную программу, результат вывода:
Ошибка в модуле в строке 4 test.pl.
признаваться() похож на die(), но обеспечивает обратную трассировку стека от того места, где произошла ошибка.
package T;require Exporter;@ISA = qw/Exporter/;@EXPORT = qw/function/;use Carp;sub function { признаваться "Ошибка в модуле!";}1;
Вызовите в скрипте следующую программу:
используйте Т;функция();
Выполняя вышеуказанную программу, результат вывода:
Ошибка в модуле! T.pm, строка 9. T::function() вызывается в test.pl, строка 4.