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
Другие расширения