Безопасность и надёжность кода
1. Осторожное использование вызовов внешних команд
Прямое использование внешних вызовов команд (через "system" или "``") допускается только в особых случаях, при этом, если
командная строка формируется внутри кода, необходимо быть абсолютно уверенным, что в командную строку не могут попасть входные переменные и параметры HTTP-запроса (см. п. 2).
Кроме того, НЕ СЛЕДУЕТ использовать qx и system в коде контроллеров. Эти вызовы могут быть сосредоточены только в коде ядра
системы и соответствующие функции обязательно должны быть покрыты тестами (проверяющими невозможность использования эксплойтов).
2. Всегда проверяйте коды возврата системных вызовов
Всегда проверяйте коды возврата системных вызовов.
Если ошибка фатальна — вызывайте исключение с помощью
die, Carp::confess или Carp::croak,
передавая соответствующее сообщение об ошибке.
Хорошее сообщение об ошибке должно включать:
в каком месте программы возникла проблема,
какой системный вызов был произведен, с какими аргументами,
и (ОЧЕНЬ ВАЖНО) должно содержать стандартное системное
описание ошибки.
Пример:
open( my $fh, ">", $filename ) or die "Can't open $filename for writing: $!";
print $fh '....';
3. Обработка исключений
При реализации обработки исключений, лучше использовать:
eval {
...
1;
} or do {
...
};
смысл eval-do в том что блок обработки ошибок (в "do") должен следовать непосредственно после eval, чтобы между ними нельзя было вставить какой-то другой код (который может испортить $@), так же решение о том, было ли исключение или нет, должно приниматься на основе кода возврата eval{} а не на основе переменной $@.
Если в данном конкретном eval-do не удобен, допустимы другие конструкции, основанные на том же принципе (однако для консистентности лучше попытаться всё же использовать eval-do):
if (eval { ...; 1 }) {
...
}
else {
...
}
ok ! eval { ...; 1 }, "some test";
если в блоке обработке ошибок мы не анализируем $@, отступление от этого правила (в части $@) допустимо:
my $success = eval {
...
1;
};
...
if ($success) {
...
}
else {
...
}
если речь идёт не о паттерне программирования "обработка исключений" (а о каком-то системном программировании, о eval EXPR), то допускается отходить от этого правила, если это сделает код лучше.