KexAri
KexAri

Reputation: 3977

Custom error function won't call in php

I am trying to create a custom error function (following a tutorial). I have:

<?php
  error_reporting(E_ERROR);
  function handleError ($errno, $errstr,$error_file,$error_line){

      echo "<b>Error:</b> [$errno] $errstr - $error_file:$error_line";
      echo "<br />";
      echo "Terminating PHP Script";
      die();

 }

 //set the error handler here, override the default
 set_error_handler("handleError");

 //cause a crash
 myfunction();

?>

However my script isn't calling the function. It just prints the default error message. Could someone give me a pointer to what I might be doing wrong here please? Is my error_reporting value wrong?

Upvotes: 2

Views: 119

Answers (2)

Marvin
Marvin

Reputation: 14355

There is nothing wrong with your code. However, the capabilities of set_error_handler are limited.

From the PHP documentation:

The following error types cannot be handled with a user defined function: E_ERROR, E_PARSE, E_CORE_ERROR, E_CORE_WARNING, E_COMPILE_ERROR, E_COMPILE_WARNING, and most of E_STRICT raised in the file where set_error_handler() is called.

If you indeed need to catch compilation errors as in your example, there is one workaround mentioned in the comments of the documentation above - the use of a shutdown function:

<?php
error_reporting(E_ERROR);

function handleError($errno, $errstr, $error_file, $error_line) {
      echo "<b>Error:</b> [$errno] $errstr - $error_file:$error_line";
      echo "<br />";
      echo "Terminating PHP Script";
      die();
}

function checkForError() {
    $error = error_get_last();
    if ($error["type"] == E_ERROR) {
        handleError($error["type"], $error["message"], $error["file"], $error["line"]);
    }
}

register_shutdown_function("checkForError");

// cause a crash
myfunction();
?>

Note that the default error handler will still be called, so this prints out:

Fatal error: Call to undefined function myfunction() in path\to\file.php on line 24
Error: [1] Call to undefined function myfunction() - path\to\file.php:24
Terminating PHP Script

You can get rid of the default message by disabling error reporting with error_reporting(0);.

If you want to handle errors from within your method execution (i.e. you have defined myfunction somewhere), your original example might already work, depending on your concrete case. Proof, e.g.:

<?php
error_reporting(E_ERROR);

function handleError($errno, $errstr, $error_file, $error_line) {
      echo "<b>Error:</b> [$errno] $errstr - $error_file:$error_line";
      echo "<br />";
      echo "Terminating PHP Script";
      die();
}

function myfunction() {
    fopen("nonexistingfile", "r");
}

// set the error handler here, override the default
set_error_handler("handleError");

// cause a crash
myfunction();
?>

This uses the custom error handler as expected and prints out:

Error: [2] fopen(nonexistingfile): failed to open stream: No such file or directory - path\to\file.php:12
Terminating PHP Script

Upvotes: 1

prodigyX12
prodigyX12

Reputation: 21

I got this code from w3schools, I think you might have a need to trigger it

<?php
// A user-defined error handler function
function myErrorHandler($errno, $errstr, $errfile, $errline) {
    echo "<b>Custom error:</b> [$errno] $errstr<br>";
    echo " Error on line $errline in $errfile<br>";
}

// Set user-defined error handler function
set_error_handler("myErrorHandler");

$test=2;

// Trigger error
if ($test>1) {
    trigger_error("A custom error has been triggered");
}
?>

Upvotes: 0

Related Questions