Функция, позволяющая использовать @ для подавления ошибок - PullRequest
2 голосов
/ 05 апреля 2011

Меня интересует, как я могу создать свою собственную функцию, позволяющую выполнять ее без регистрации ошибок, но только если она выполняется с оператором @, например @function();?

Функция:

public function query($sql, $id = false){
    $this->query_id = mysqli_query($this->connection, $sql);
    if(!$this->query_id){
        // I want to suppress this error call here...
        psyo::error("Error while executing query (sql: {$sql}).");
        return NULL;
    }else{
        $this->result = mysqli_store_result($this->connection);
        $this->affected = mysqli_affected_rows($this->connection);
        return $id ? $this->query_id : $this;
    }
}

PS Я использую свой собственный класс обработки ошибок, и он не работает с error_log(); или около того.

Заранее спасибо!

Ответы [ 3 ]

5 голосов
/ 05 апреля 2011

Я не думаю, что есть способ узнать , чтобы точно знать, использовался ли @ -оператор для вызова функции, но вы можете использовать error_reporting() для проверки текущего уровня, который равен 0 когда используется @ -оператор.

function test()
{   
    var_dump(error_reporting());
}

test();
@test();
2 голосов
/ 05 апреля 2011

Оператор @ является просто сокращением для следующего:

$oldReportingLevel = error_reporting();
error_reporting(0);
 // execute @'d code here
error_reporting($oldReportingLevel);

Другими словами, @ временно устанавливает уровень сообщения об ошибках равным 0. Хотя вы не можете проверить, действительно литекущий уровень сообщений об ошибках вызван оператором @ или нет, вы можете проверить текущий уровень сообщений об ошибках и обойти собственную обработку ошибок, если уровень равен 0.

Что вынаверно хочу вот что:

if (error_reporting() != 0) {
 psyo::error("Error while executing query (sql: {$sql}).");
}
2 голосов
/ 05 апреля 2011

Если я вас правильно понимаю, вы хотите, чтобы ваш собственный класс подавлял свои ошибки.Одним из способов является создание логической переменной в классе showErrors, а затем в функции psyo::error проверьте эту переменную.Если showErrors имеет значение true, отобразите их, в противном случае не отображайте их, а зарегистрируйте их (или обрабатывайте их так, как хотите).

Если вы хотите, чтобы символ @ подавлял ваши ошибки класса, которыепередаются функции ошибок, тогда я думаю, что ваша функция ошибок должна была бы "вызвать ошибки".Подробнее см. trigger_error.

...