Perl: обработка ошибок
Во время выполнения программы вы всегда будете сталкиваться с различными ошибками, например при открытии несуществующего файла.
Если во время выполнения программы возникает ошибка, программа останавливается. Нам нужно использовать некоторые методы обнаружения, чтобы избежать ошибок и тем самым предотвратить завершение программы.
Perl предоставляет несколько методов обработки ошибок, и мы рассмотрим их по одному.
инструкция if
оператор ifОн может определять возвращаемое значение оператора, как показано в следующем примере:
if(open(DATA, $file)){
...
}else{
die "Error: 无法打开文件 - $!";
}
В программе переменная $! возвращает сообщение об ошибке. Мы также можем упростить приведённый выше код до следующего кода:
open(DATA, $file) || die "Error: 无法打开文件 - $!";
Функция unless
unlessФункция противоположна if; она выполняется только тогда, когда выражение возвращает false, как показано ниже:
unless(chdir("/etc")){
die "Error: 无法打开目录 - $!";
}
unlessОператор очень полезен, когда вы хотите настроить оповещения об ошибках. Мы также можем записать приведённый выше код в сокращённой форме:
die "Error: 无法打开目录!: $!" unless(chdir("/etc"));
Приведённое выше сообщение об ошибке будет выводиться только тогда, когда переключение каталога завершится неудачно.
Тернарный оператор
Ниже приведён простой пример тернарного оператора:
print(exists($hash{value}) ? '存在' : '不存在',"\n");
В приведённом выше примере мы использовали тернарный оператор, чтобы проверить, существует ли значение хеша.
Пример содержит одно выражение и два значения в формате:expression ? value1 : value2。
Функция warn
Функция warn используется для вызова предупреждающего сообщения и не выполняет других действий. Она выводит данные в STDERR (файл стандартных ошибок) и обычно используется для подсказки пользователю:
chdir('/etc') or warn "无法切换目录";
Функция die
Функция die аналогична warn, но она завершает работу. Обычно она используется для вывода сообщений об ошибках:
chdir('/etc') or die "无法切换目录";
Модуль Carp
В скриптах Perl распространённый способ сообщать об ошибках — использовать функции warn() или die() для сообщения или генерации ошибок. Модуль Carp, напротив, обеспечивает дополнительный уровень контроля над создаваемыми сообщениями, особенно внутри модулей.
Стандартный модуль Carp предоставляет альтернативы функциям warn() и die(). Они дают больше информации для определения места ошибки и более удобны для пользователя. При использовании в модуле сообщение об ошибке включает имя модуля и номер строки.
Функция carp
Функция carp может выводить информацию о трассировке программы, подобно функции warn, и обычно отправляет эту информацию в STDERR:
package T;
require Exporter;
@ISA = qw/Exporter/;
@EXPORT = qw/function/;
use Carp;
sub function {
carp "Error in module!";
}
1;
Вызовите следующую программу в скрипте:
use T; function();
При выполнении вышеуказанной программы выводится следующий результат:
Error in module! at test.pl line 4
Функция cluck
cluck() аналогична warn(), предоставляя обратную трассировку стека от места возникновения ошибки.
package T;
require Exporter;
@ISA = qw/Exporter/;
@EXPORT = qw/function/;
use Carp qw(cluck);
sub function {
cluck "Error in module!";
}
1;
Вызовите следующую программу в скрипте:
use T; function();
При выполнении вышеуказанной программы выводится следующий результат:
Error in module! at T.pm line 9 T::function() called at test.pl line 4
Функция croak
croak() подобна die() и может завершить скрипт.
package T;
require Exporter;
@ISA = qw/Exporter/;
@EXPORT = qw/function/;
use Carp;
sub function {
croak "Error in module!";
}
1;
Вызовите следующую программу в скрипте:
use T; function();
При выполнении вышеуказанной программы выводится следующий результат:
Error in module! at test.pl line 4
Функция confess
confess() аналогична die(), но обеспечивает обратную трассировку стека от места возникновения ошибки.
package T;
require Exporter;
@ISA = qw/Exporter/;
@EXPORT = qw/function/;
use Carp;
sub function {
confess "Error in module!";
}
1;
Вызовите следующую программу в скрипте:
use T; function();
При выполнении вышеуказанной программы выводится следующий результат:
Error in module! at T.pm line 9 T::function() called at test.pl line 4Другие расширения