En gros, les erreurs sont un héritage de PHP, alors que les exceptions sont la façon moderne de traiter les erreurs. La chose la plus simple est de mettre en place un gestionnaire d'erreurs, qui lance une exception. De cette façon, toutes les erreurs sont converties en exceptions, et vous n'avez plus qu'un seul système de gestion des erreurs à gérer. Le code suivant convertira les erreurs en exceptions pour vous :
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');
error_reporting(E_ALL ^ E_STRICT);
Il existe cependant quelques cas où le code est spécifiquement conçu pour fonctionner avec des erreurs. Par exemple, le schemaValidate
méthode de DomDocument
soulève des avertissements, lors de la validation d'un document. Si vous convertissez les erreurs en exceptions, la validation s'arrêtera après le premier échec. Parfois, c'est ce que vous voulez, mais lorsque vous validez un document, vous pouvez en fait vouloir todo des échecs. Dans ce cas, vous pouvez installer temporairement un gestionnaire d'erreurs, qui collecte les erreurs. Voici un petit extrait, que j'ai utilisé à cette fin :
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;
}
}
Et un cas d'utilisation :
$doc = new DomDocument();
$doc->load($xml_filename);
$validation = new errorhandler_LoggingCaller();
$validation->call(
array($doc, 'schemaValidate'),
array($xsd_filename));
if ($validation->hasErrors()) {
var_dump($validation->getErrors());
}