Это кошерный для присвоения $! в Perl?

Мне нравится этот:

function isTouchDevice(){
    return typeof window.ontouchstart !== 'undefined';
}

alert(isTouchDevice());
6
задан Paul Nathan 25 June 2009 в 16:22
поделиться

7 ответов

Если вы присвоите переменной $ !, она будет помещена в системную переменную errno, которая принимает только числа. Таким образом, вы действительно можете сделать:

use Errno "EEXIST";
$! = EEXIST;
print $!;

и получить строковое значение для определенного номера системной ошибки, но вы не можете сделать то, что хотите - установить для него произвольную строку. Такая строка даст вам аргумент "..." не является числовым в предупреждении о скалярном присваивании и оставит errno равным 0.

Другая проблема заключается в том, что $! может быть изменен любым системным вызовом. Таким образом, вы можете доверять ему только то, что вы установили значение, пока вы не сделаете печать или что-то еще. Возможно, вам понадобится ваша собственная переменная ошибки.

12
ответ дан 8 December 2019 в 03:28
поделиться

Что ж, в документации говорится, что это, в основном, индикатор системных ошибок. Так что я бы не стал его назначать, вы просто рассердите пользователей вашей библиотеки.

Используйте вместо этого исключения:

eval { # this ain't the evil eval
   # some code
   die $something;
}
if (my $err = $@) {
   # exception handling
}

Обратите внимание, что вы можете «бросить» или умереть с чем угодно…

9
ответ дан 8 December 2019 в 03:28
поделиться

Мой раввин сказал «нет!»

3
ответ дан 8 December 2019 в 03:28
поделиться

Да, вы можете назначать элементы (#) для $ !, только будьте осторожны с тем, где вы это делаете, чтобы не испортить сообщение с некоторыми другими функциями.

2
ответ дан 8 December 2019 в 03:28
поделиться

Настройка $! подходит, но:

  • вы должны сделать это в конце вашей функции
  • , вы должны вернуть другое значение, которое указывает, что произошла ошибка
  • , вы должны использовать значения errno вашей ОС, а не строки для целей настройки
  • , код проверки должен проверять значение, должно делать это немедленно при сбое функции (и только если сбой указывается функцией)

Следует иметь в виду, что die использует значение из $! для кода выхода (если он не равен нулю).

3
ответ дан 8 December 2019 в 03:28
поделиться

Если у вас есть только одна переменная для хранения ошибок, вы возникнут проблемы, если в вашей программе возникает более одной ошибки, прежде чем проверять состояние переменной ошибки. Этого стоит избегать, если вы можете помочь.

К счастью, в Perl вы можете помочь. Очень хорошее решение - использовать объектно-ориентированную обработку исключений из Error.pm . Этот модуль позволит вам писать блоки try / catch, например:

try {
    some code;
    code that might thrown an exception;
    more code;
    return;
}
catch Error with {
    my $ex = shift;   # Get hold of the exception object
    # handle the exception;
};

Документация CPAN для этого модуля неплохая, и есть статья на Perl.com по этой теме.

0
ответ дан 8 December 2019 в 03:28
поделиться

$! имеет так много предостережений, что это глобальная переменная, которой назначается множество функций (некоторые из них - функции 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... };

Поскольку это исключительный случай, он должен быть там, где пользователь должен помнить о добавлении дополнительного кода и выполнять больше работы.

Примеры этого подхода включают DBI '

0
ответ дан 8 December 2019 в 03:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: