PHP/Java: что означает использование @ в PHP? Есть ли у Java какой-либо эквивалент?
Этот вопрос возник из проблемы, поднятой пользователем этого сайта.
в PHP используются выражения типа:
if ($var == "Uno" || @intval($var1) == 1){
echo "Picked 1";
}
Что означает@, используемый в @intval($var1)
?
Есть ли эквивалент в Java?
3 answers
@ перед выражением или командой работает как подавитель ошибок. Если выполнение выражения или команды вызывает ошибку, программа тихо терпит неудачу, следуя своему курсу, и никто не знает, что что-то пошло не так.
Подавитель ошибок-очень плохая практика , потому что это делает невозможным отладку вашего кода. На практике, в зависимости от изменений, которые вы вносите перед приглушенным выражением, ошибка, которую вы подавляете, может пойти изменится, и ты не узнаешь.
Используя типичный пример:
function getHandle(file) {
...algunos comandos...
$handle = fopen(file,r);
return $handle;
}
Если этот файл не существует программа генерирует ошибку типа E_WARNING
, поэтому в 2000-2006 годах он обрабатывался так
function getHandle(file) {
...algunos comandos...
$handle = @fopen(file,r);
return $handle;
}
Если файл не существует, мы просто проверяем, не равно ли $handle
false
.
Итак, некоторые пошли дальше и, чтобы сэкономить проблемы, написали, например:
$handle = @getHandle('archivo.txt');
И подавление ошибок функции вы подавляете любые ошибки внутри него. Вы не должны знать, не удалось ли fopen
или какая-либо из других команд. Как отладить это?
Таким образом, подавитель ошибок использовался, чтобы заглушить целые разделы кода, который затем не работал, и никто не понимал, почему.
Правильный способ сделать это-вместо этого поймать ошибку в исключении, используя try...catch
но ...
Что делать, когда выражение не выбрасывает исключение но он терпит неудачу с треском?
Ну, просто не позволяйте getHandle выбрасывать E_WARNING или подавлять его, но обрабатывать ошибку и поднимать исключение самостоятельно:
function getHandle(file) {
...algunos comandos...
if(is_readable(file)) {
$handle = fopen(file,r);
... otros comandos ...
return $handle;
} else {
throw new \Exception('el archivo no existe');
}
}
И при вызове getHandle
вы можете обернуть, теперь да, в блок try / catch
.
try {
$handle = getHandle('archivo.txt');
} catch (\Exception $e) {
echo "La función ha fallado con mensaje: ".$e->getMessage();
}
В этом случае вы точно знаете, почему это не удалось. И если внутри функции getHandle
есть 10 вещей, которые могут сломаться, каждый из них сможет выбросить свое собственное исключение с описательным сообщением.
Те ты понимаешь разницу? Вместо того, чтобы допустить ошибку, которая прерывает поток или подавляет его с непредсказуемыми результатами, вы ловите его и делаете что-то, что меняет поток программы. Таким образом, нет программ, которые работают и программы, которые падают, но только программы, которые работают по-разному в соответствии с тем, что они находят.
В текущих версиях самых популярных фреймворков используются пользовательские обработчики ошибок, которые преобразуют ошибки в исключения, из таким образом, каждая ошибка становится исключением, и вы можете использовать try/catch
сдельно.
Что опасно в этом, так это то, что не пойманное исключение всегда является ошибкой E_FATAL
, поэтому при использовании этих ErrorHandlers вы должны быть очень дотошными с использованием try ... catch.
Что касается вашего второго вопроса: более надежные языки, такие как Java, C# или Python, не имеют этого недостатка PHP в отношении двойственности между ошибками и исключениями (PHP имеет много двойственностей ,которые являются его основным по умолчанию), поэтому ваш веер возможностей ограничен тем, чтобы поймать исключение или скрестить пальцы.
В целом на таких языках вы можете регулировать многословие ошибки, чтобы отображать меньше ошибок на экране и отправлять их прямо в журнал, чтобы не предоставлять конечному пользователю информацию, предназначенную для отладки. Эквивалентом подавления ошибок было бы установить, что журнал ошибок записывается в /dev/null
.
Знак arroba (@). При добавлении к выражению в PHP, любое сообщение об ошибке, которые могут быть сгенерированы этим выражением будет проигнорировано. Источник
Я понимаю, что ничего подобного не существует в java, однако есть один, что другой обманывает, в java 8, например, я видел использование лямбда-выражений набор имеет что-то похожее на шаблон command (command pattern)
- Как я прокомментировал Malcam в @ в php это помогает, в случае, если об этом не поднять и ocacione исключение в наш php-код, в случае ошибки, очень похоже, когда вы используете try{} catch(){} и ваш код находится внутри try и это вызывает ошибку, но в catch только оставить пустым раздел внутри
try {
...
} catch (Exception $ignoreexcepcion) {
echo "Si dejo esta parte vacia no mostrara el error";
}
И, как вы уже знаете в java, также возможно использование try catch
try {
...
} catch (ignoreexcepcion) {
alert("Excepcion en mi codigo";
}
Хотя это противоречит хорошей практике Программирование оставить пустой catch иногда является лучшим решением, пока вы найдете правильный: D
PS: Я не знаю прямого эквивалента в java для функции, которую @ выполняет в php.
Http://php.net/manual/es/language.operators.errorcontrol.php