Мне нравится этот:
function isTouchDevice(){
return typeof window.ontouchstart !== 'undefined';
}
alert(isTouchDevice());
Если вы присвоите переменной $ !, она будет помещена в системную переменную errno, которая принимает только числа. Таким образом, вы действительно можете сделать:
use Errno "EEXIST";
$! = EEXIST;
print $!;
и получить строковое значение для определенного номера системной ошибки, но вы не можете сделать то, что хотите - установить для него произвольную строку. Такая строка даст вам аргумент "..." не является числовым в предупреждении о скалярном присваивании и оставит errno равным 0.
Другая проблема заключается в том, что $! может быть изменен любым системным вызовом. Таким образом, вы можете доверять ему только то, что вы установили значение, пока вы не сделаете печать или что-то еще. Возможно, вам понадобится ваша собственная переменная ошибки.
Что ж, в документации говорится, что это, в основном, индикатор системных ошибок. Так что я бы не стал его назначать, вы просто рассердите пользователей вашей библиотеки.
Используйте вместо этого исключения:
eval { # this ain't the evil eval
# some code
die $something;
}
if (my $err = $@) {
# exception handling
}
Обратите внимание, что вы можете «бросить» или умереть с чем угодно…
Да, вы можете назначать элементы (#) для $ !, только будьте осторожны с тем, где вы это делаете, чтобы не испортить сообщение с некоторыми другими функциями.
Настройка $!
подходит, но:
Следует иметь в виду, что die использует значение из $! для кода выхода (если он не равен нулю).
Если у вас есть только одна переменная для хранения ошибок, вы возникнут проблемы, если в вашей программе возникает более одной ошибки, прежде чем проверять состояние переменной ошибки. Этого стоит избегать, если вы можете помочь.
К счастью, в 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 по этой теме.
$! имеет так много предостережений, что это глобальная переменная, которой назначается множество функций (некоторые из них - функции 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 '