$! имеет столько предостережений, поскольку является глобальной переменной, которой назначено множество функций (некоторые из них - функции C, которые вызывает Perl), что я просто выбросил бы исключение (которое в Perl означает смерть) и позволил бы пользователю перехватить его, если им будет интересно. Поэтому вместо того, чтобы писать:
$obj->foo or die $!;
$obj->bar or die $!;
$obj->baz or die $!;
или даже
$obj->foo or die $obj->error;
$obj->bar or die $obj->error;
$obj->baz or die $obj->error;
Вы можете просто написать
$obj->foo;
$obj->bar;
$obj->baz;
и знайте, что в случае ошибки вам сообщат об этом. Также любой, кто выше вас, будет проинформирован и сможет его заманить в ловушку. Поскольку это наиболее распространенный случай, когда пользователю не нужно запоминать его и вводить его снова и снова.
Если вы хотите игнорировать или исправить ошибку, просто используйте eval BLOCK
.
eval { $obj->foo }; # don't care if it works or not
eval { $obj->bar } or do { ...something when it doesn't work... };
Поскольку это исключительный случай, пользователь должен помнить, чтобы добавить больше кода и выполнить больше работы.
Примеры этого подхода включают флаг RaiseError DBI , который по умолчанию отключен только для обратной совместимости, и замечательный autodie модуль.