2010-10-14 5 views
6

Un autre collègue et moi-même avons considérablement modifié l'extension PHP Zookeeper, mais la seule chose qui me dérange vraiment est la dépendance aux erreurs PHP contre les exceptions.Lancer une exception au lieu d'une erreur à partir d'une extension PHP

La source originale est ici: http://github.com/andreiz/php-zookeeper/blob/master/php_zookeeper.c#L209

Au contraire, il serait plus agréable de jeter un Zookeeper_NodeNotExists ou similaire sauf que je ne sais pas ce que l'appel de l'API dans c est. J'ai essayé de googler et j'ai obtenu un ensemble d'exceptions en langage PHP, le manuel de PHP ne semble pas les mentionner, et je ne peux pas me rappeler quelles extensions d'actions PHP jettent une exception pour vous. Existe-t-il une source alternative de documentation sur l'API PHP/Zend c?

+0

La dernière fois que j'ai regardé (c'était il y a longtemps) PHP était écrit en 'C'. Il n'y a aucune exception dans 'C'. – pmg

+0

Regardez à travers la source de diverses exceptions qui jettent des exceptions (ne peut pas penser à tout de suite ... cerveau frit), et voir ce qu'ils utilisent. –

+1

@pmg Non, le langage C n'a pas de concept pour try/catch ... mais PHP5 le fait, donc il doit y avoir une fonction zend_ ou php_ API qui jette une exception de l'extension dans un script PHP – David

Répondre

7

J'ai regardé le code source pour l'extension SQLite PHP 5.3, en particulier Sqlite.c que je connaissais jeté une exception et trouvé

via SQLite - https://github.com/php/php-src/blob/PHP-5.3/ext/sqlite/sqlite.c#L46

#include "zend_exceptions.h" 

En zend_exceptions.h, il ressemble à un RuntimeException peut être soulevée par un simple appel à

zend_throw_exception(NULL, "Some text") 

comme expliqué ici https://github.com/php/php-src/blob/PHP-5.3/Zend/zend_exceptions.h#L43

L'extension Sqlite3 utilise comme ceci:

zend_throw_exception(zend_exception_get_default(TSRMLS_C), "Already initialised DB Object", 0 TSRMLS_CC); 

où je déduis que zend_exception_get_default() obtient une référence/poignée à RuntimeException, le 2ème argument est le message d'exception, et tous les autres travaux sont délégués.

Questions connexes