I was confused as to what the @ symbol actually does, and after a few experiments have concluded the following:
* the error handler that is set gets called regardless of what level the error reporting is set on, or whether the statement is preceeded with @
* it is up to the error handler to impart some meaning on the different error levels. You could make your custom error handler echo all errors, even if error reporting is set to NONE.
* so what does the @ operator do? It temporarily sets the error reporting level to 0 for that line. If that line triggers an error, the error handler will still be called, but it will be called with an error level of 0
Hope this helps someone
Оператори за контрол на грешките
PHP поддържа един оператор за контрол на грешки: символът at (@). Когато бъде поставен пред израз в PHP, всички съобщения за грешка, които биха били генерирани от този израз, ще бъдат пренебрегнати.
Ако свойството track_errors е включено, всички съобщения за грешка, генерирани от израза, ще бъдат запазени в променливата $php_errormsg. Тази променлива ще бъде презаписвана при всяка грешка, така че ако искате да я използвате трябва да я проверявате възможно най-рано.
<?php
/* Intentional file error */
$my_file = @file ('non_existent_file') or
die ("Несполучливо отваряне на файл: грешката беше '$php_errormsg'");
// това работи за всякакви изрази, не само за функции:
$value = @$cache[$key];
// няма да изведе съобщение (notice) ако ключът $key не съществува.
?>
Забележка: Операторът @ работи единствено върху изрази. Правилото е: ако можете да вземете стойността на нещо, то можете да поставите и оператора @ пред него. Например, можете да го слагате пред променливи, извиквания на функции и включвания посредством include(), пред константи, и т.н. Не можете да го поставяте пред дефиниции на функции или класове, или пред условни структури като if и foreach, и т.н.
Вж. също error_reporting() и раздела от ръководството Функции за обработка на грешки и дневници.
Понастоящем употребата на оператора за контрол на грешки "@" ще изключи отчитането на грешки дори и за критични грешки, които прекъсват изпълнението на скрипта. Това също означава, че ако използвате "@", за да подтиснете грешките от дадена функция, и ако последната не е налична или пък е написана погрешно, скриптът ще умре точно на това място без никаква индикация за причината.
Оператори за контрол на грешките
12-Aug-2008 06:29
27-May-2008 12:29
NB The @ operator doesn't work when throwing errors as exceptions using the ErrorException class
03-Jan-2007 09:58
If you want to log all the error messages for a php script from a session you can use something like this:
<?php
session_start();
function error($error, $return=FALSE) {
global $php_errormsg;
if(isset($_SESSION['php_errors'])) {
$_SESSION['php_errors'] = array();
}
$_SESSION['php_errors'][] = $error; // Maybe use $php_errormsg
if($return == TRUE) {
$message = "";
foreach($_SESSION['php_errors'] as $php_error) {
$messages .= $php_error."\n";
}
return $messages; // Or you can use use $_SESSION['php_errors']
}
}
?>
Hope this helps someone...
error_reporting()==0 for detecting the @ error suppression assumes that you did not set the error level to 0 in the first place.
However, typically if you want to set your own error handler, you would set the error_reporting to 0. Therefore, an alternative to detect the @ error suppression is required.
13-Oct-2006 04:38
To suppress errors for a new class/object:
<?php
// Tested: PHP 5.1.2 ~ 2006-10-13
// Typical Example
$var = @some_function();
// Class/Object Example
$var = @new some_class();
// Does NOT Work!
//$var = new @some_class(); // syntax error
?>
I found this most useful when connecting to a
database, where i wanted to control the errors
and warnings displayed to the client, while still
using the class style of access.
03-Mar-2005 06:25
If you wish to display some text when an error occurs, echo doesn't work. Use print instead. This is explained on the following link 'What is the difference between echo and print?':
http://www.faqts.com/knowledge_base/view.phtml/aid/1/fid/40
It says "print can be used as part of a more complex expression where echo cannot".
Also, you can add multiple code to the result when an error occurs by separating each line with "and". Here is an example:
<?php
$my_file = @file ('non_existent_file') or print 'File not found.' and $string = ' Honest!' and print $string and $fp = fopen ('error_log.txt', 'wb+') and fwrite($fp, $string) and fclose($fp);
?>
A shame you can't use curly brackets above to enclose multiple lines of code, like you can with an if statement or a loop. It could make for a single long line of code. You could always call a function instead.
26-Dec-2004 06:19
Better use the function trigger_error() (http://de.php.net/manual/en/function.trigger-error.php)
to display defined notices, warnings and errors than check the error level your self. this lets you write messages to logfiles if defined in the php.ini, output
messages in dependency to the error_reporting() level and suppress output using the @-sign.
