web-dev-qa-db-fra.com

Erreur de gestion d'un plugin avec des exceptions

Je crée un nouveau plugin et je veux gérer les erreurs proprement. Je trouve la classe WP_Error difficile à manier, alors j’ai décidé d’utiliser des exceptions. Le manque de support PHP 4 ne me dérange pas.

$error = true;
if ($error) {
    // Throw an error
    throw new CustomException('A custom exception');
}

Ce que je veux vraiment pouvoir faire, c'est lancer des exceptions conformément au code ci-dessus dans mon plugin (et utiliser des blocs try/catch le cas échéant), mais quand il y a une exception non capturée, je veux pouvoir définir un gestionnaire d'erreurs c'est-à-dire : set_exception_handler() qui ne capture que les exceptions non capturées de mon plugin. Ainsi, si un autre gestionnaire d'exceptions de thèmes a déjà été défini, il n'interfère pas.

Mieux encore, j'intercepterais n'importe laquelle de mes exceptions de plug-in, je les traiterais comme il convient, puis je pourrais choisir de les transférer sur tout autre gestionnaire d'exceptions déjà défini.

Est-ce possible? Ou est-il possible de définir un gestionnaire d'exceptions qui capture uniquement les exceptions dans la classe où il est défini? Je réfléchissais à la création d'une customException qui étendait l'exception, puis à la création d'un gestionnaire d'exception fourre-tout personnalisé.

1
The Salt

Vous pouvez également prolonger les expections et ne capturer que celles que vous lancez.

Par exemple:

function do_add_my_pws_exceptions() {
   class PWS_Exception extends Exception {}
   class PWS_Init_Exception extends PWS_Exception {}
}
add_action('plugins_loaded', 'do_add_my_pws_exceptions');

Bien sûr, vous devez être certain que l'utilisateur exécute au moins la version 5 de PHP en demandant à votre thème d'activation de plug-in d'effectuer les opérations suivantes:

$php_version = phpversion();
if ( version_compare( $php_version, '5.3', '<' ) ) {
    # deactivate your plugin or abort installing your theme and tell the user why
}

Quoi qu'il en soit, une fois que cela est fait, vous pouvez alors faire des choses comme:

try {
   # whatever you are doing
   throw new PWS_Exception("This is my exception", 10001);
} catch ( PWS_Exception $e ) {
   # Your custom handling
}

Les exceptions non levées par vous ne seront pas attrapées.

2
Privateer

Lorsque vous utilisez set_exception_handler, le nom du gestionnaire d'exceptions précédent est renvoyé. Vous pouvez le stocker et l'utiliser avec call_user_func ou simplement utiliser la syntaxe ().

http://us.php.net/manual/en/function.set-exception-handler.php

$prev_handler = set_exception_handler('my_handler');
call_user_func($prev_handler, $exception);
# OR
$prev_handler($exception);
1
totels