2010-08-22 9 views
5

Ich habe ein paar Helfer erstellt, um irgendwelche PPH-Fehler zu erfassen und dann einen Curl-Post zu senden, der ein Ticket mit meiner Bug-Tracking-Software erstellt.set_error_handler in Codeigniter?

Aber ich kann es nicht mit Codeigniter arbeiten. Hier ist mein Code:


<? function phpErrorHandler($errno, $errstr, $errfile, $errline, $errcontext){ 

    //If is a notice do nothing. 
    if($errno == E_NOTICE | $errno == E_USER_NOTICE): null; else: 

    //Error types 
    $errortype = array(
     E_ERROR   => 'Error', 
     E_WARNING   => 'Warning', 
     E_PARSE   => 'Parsing Error', 
     E_NOTICE   => 'Notice', 
     E_CORE_ERROR  => 'Core Error', 
     E_CORE_WARNING => 'Core Warning', 
     E_COMPILE_ERROR => 'Compile Error', 
     E_COMPILE_WARNING => 'Compile Warning', 
     E_USER_ERROR  => 'User Error', 
     E_USER_WARNING => 'User Warning', 
     E_USER_NOTICE  => 'User Notice', 
     E_STRICT   => "Runtime Notice"); 

    //Just get the filename for the title. 
    $filenameGoBoom = explode('/',print_r($errfile, true)); 
    $filename = end($filenameGoBoom); 

    //MySQL 
    if ($errstr == "(SQL)"): 
     $errstr = "SQL Error [$errno] " . SQLMESSAGE . "<br />\n"; 
     $errstr .= "Query : " . SQLQUERY . "<br />\n"; 
     $errstr .= "On line " . SQLERRORLINE . " in file " . SQLERRORFILE . " "; 
    endif; 

    //Write the report and set out the data 
    $prefix = ($errortype[$errno]) ? $errortype[$errno] : "Unknown"; 
    $title = ($errortype[$errno]) ? $filename ." on line ". print_r($errline, true) : "Unknown error type: [$errfile:$errline] [$errno] $errstr"; 
    $error = "\n\n---Data---\n". print_r($errstr, true). 
    "\n\n---File---\n". print_r($errfile, true). "on line ". print_r($errline, true)." @".date('Y-m-d H:i:s'). 
    "\n\n---Context---\n".print_r($errcontext, true). 
    "\n\n". print_r(debug_backtrace(), true); 

     //Send! Show the error and stop executing the code 
     sendError($prefix, $title , $error); 

     echo "Whoops, something went wrong, it could of been something you did, or something we've done or didn't expect. Please try again, this error has been reported to us.".$errline.$errstr; 

     die(); 

    endif; 
} 

function mysqlErrorHandler(){ 

    //Setup variables. 
    $prefix = 'MySQL'; 
    $title = 'Error - '.mysql_errno(); 
    $error = 'MySQL Error '.mysql_errno().':'.mysql_error(); 

    //Send! 
    sendError($prefix,$title,$description); 

    //Kill the script 
    die(); 

} 

function fatalErrorHandler(){ 

    $isError = false; 
    if ($error = error_get_last()): 
     switch($error['type']){ 
      case E_ERROR: 
      case E_CORE_ERROR: 
      case E_COMPILE_ERROR: 
      case E_USER_ERROR: 
      $isError = true; 
      break; 
      } 
     endif; 

    if ($isError): 
     $prefix = 'Fatal'; 
     $title = 'Check this out'; 
     $error = $error['message']; 

     sendError($prefix, $title , $error); 

     echo "Whoops, something went wrong, it could of been something you did, or something we've done or didn't expect. Please try again, this error has been reported to us."; 

    endif; 
} 

set_error_handler('phpErrorHandler'); 
register_shutdown_function('fatalErrorHandler'); 
?> 

Es ist nicht alles poliert, aber das ist der Code im mit. (einige Bits zum Aufräumen & entfernen) Es ist in einer Hilfsdatei, die von Codeigniter automatisch geladen wird.

Irgendwelche Ideen?

Danke.

+1

Können Sie weitere Informationen darüber, wo es in Ihrer Codeigniter-Anwendung genau scheitert? Etwas Code von Ihrem Controller/Modell, in dem Sie Ihren Fehlerhelfer aufrufen, könnte helfen. – Shivaas

Antwort

5

Sie können ein paar Dinge schnell machen, um das Problem zu lösen.

  1. Verwenden Sie den obigen Code in einem eigenständigen PHP-Skript und erstellen Sie einen absichtlichen Fehler. Wenn der Code funktioniert, versuchen Sie, codeigniterspezifischen Fehlerbehandlungsmechanismus zu finden.

  2. Ersetzen Sie den Inhalt der phpErrorHandler-Funktion durch etwas Einfaches, wie das Drucken von etwas im Protokoll und sehen Sie, ob die Funktion selbst im Fehlerfall ausgeführt wird. Wenn ja, müssen Sie nur den Code für den Fehlerbehandler korrigieren.

  3. Für die codereignerspezifische Fehlerbehandlung können Sie die Bibliotheksklasse 'Exception' überschreiben, indem Sie die Klasse My_Exception im Ordner application/libraries erstellen. Kopieren Sie die ursprünglichen Bibliothekssignaturen und fügen Sie Ihren Code ein. Es wird sicherlich funktionieren.