PHP/Java: что означает использование @ в PHP? Есть ли у Java какой-либо эквивалент?


Этот вопрос возник из проблемы, поднятой пользователем этого сайта.

в PHP используются выражения типа:

if ($var == "Uno" || @intval($var1) == 1){
    echo "Picked 1";
}

Что означает@, используемый в @intval($var1)?

Есть ли эквивалент в Java?

 8
Author: A. Cedano, 2017-03-07

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.

 4
Author: ffflabs, 2017-03-21 10:40:34

Знак arroba (@). При добавлении к выражению в PHP, любое сообщение об ошибке, которые могут быть сгенерированы этим выражением будет проигнорировано. Источник

Я понимаю, что ничего подобного не существует в java, однако есть один, что другой обманывает, в java 8, например, я видел использование лямбда-выражений набор имеет что-то похожее на шаблон command (command pattern)

Чешский этот ответ

 3
Author: MalCam, 2017-05-23 12:39:20

- Как я прокомментировал 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

Http://php.net/manual/es/language.exceptions.php

 1
Author: FRANKY QUINTERO, 2017-03-09 03:07:50