2009-01-18 5 views
3

J'essaye de comprendre s'il y a une bonne ou une meilleure méthode pour manipuler des erreurs dans PHP que ce que je fais ci-dessous. Je voudrais lancer une exception s'il y a un problème avec l'appel parse_ini_file. Cela fonctionne, mais y a-t-il une façon plus élégante de gérer les erreurs?Traitement des erreurs en tant qu'exceptions. Meilleures méthodes?

public static function loadConfig($file, $type) 
{ 
    if (!file_exists($file)) 
    { 
     require_once 'Asra/Core/Exception.php'; 
     throw new Asra_Core_Exception("{$type} file was not present at specified location: {$file}"); 
    } 

    // -- clear the error 
    self::$__error = null; 
    // -- set the error handler function temporarily 
    set_error_handler(array('Asra_Core_Loader', '__loadConfigError')); 
    // -- do the parse 
    $parse = parse_ini_file($file, true); 
    // -- restore handler 
    restore_error_handler(); 

    if (!is_array($parse) || is_null($parse) || !is_null(self::$__error)) 
    { 
     require_once 'Asra/Core/Exception.php'; 
     throw new Asra_Core_Exception("{$type} file at {$file} appears to be  
    } 
} 

La fonction __ loadConfigError définit seulement la __error à la chaîne d'erreur:

private static function __loadConfigError($errno, $errstr, $errfile, $errline) 
{ 
    self::$__error = $errstr; 
} 

Merci!

Répondre

5

installer généralement un gestionnaire d'erreur global pour convertir des erreurs en exceptions:

function exceptions_error_handler($severity, $message, $filename, $lineno) { 
    if (error_reporting() == 0) { 
    return; 
    } 
    if (error_reporting() & $severity) { 
    throw new ErrorException($message, 0, $severity, $filename, $lineno); 
    } 
} 
set_error_handler('exceptions_error_handler'); 

Pour les rares cas où je veux vraiment recueillir un tas d'avertissements, je retourne le gestionnaire ci-dessus temporairement hors. Il est emballé bien dans une classe:

/** 
* Executes a callback and logs any errors. 
*/ 
class errorhandler_LoggingCaller { 
    protected $errors = array(); 
    function call($callback, $arguments = array()) { 
    set_error_handler(array($this, "onError")); 
    $orig_error_reporting = error_reporting(E_ALL); 
    try { 
     $result = call_user_func_array($callback, $arguments); 
    } catch (Exception $ex) { 
     restore_error_handler(); 
     error_reporting($orig_error_reporting); 
     throw $ex; 
    } 
    restore_error_handler(); 
    error_reporting($orig_error_reporting); 
    return $result; 
    } 
    function onError($severity, $message, $file = null, $line = null) { 
    $this->errors[] = $message; 
    } 
    function getErrors() { 
    return $this->errors; 
    } 
    function hasErrors() { 
    return count($this->errors) > 0; 
    } 
} 
Questions connexes