2010-10-14 11 views
6

Otro compañero de trabajo y yo hemos estado modificando en gran medida la extensión PHP Zookeeper pero lo que realmente me molesta es la dependencia de las Excepciones de error de PHP.Lanzar una excepción en lugar de un error de una extensión de PHP

La fuente original es aquí: http://github.com/andreiz/php-zookeeper/blob/master/php_zookeeper.c#L209

lugar que sería mejor para vomitar un Zookeeper_NodeNotExists o similar, excepto que no tengo idea de lo que es la llamada a la API en C.

He intentado buscar en Google y obtuve un conjunto de resultados cornucopia de Excepciones en el lenguaje PHP, el manual de PHP no parece mencionarlos, y no recuerdo qué extensiones de stock PHP arrojan la excepción para usted. ¿Existe alguna fuente alternativa de documentación sobre PHP/Zend c API?

+0

La última vez que miré (fue hace mucho tiempo) PHP se escribió en 'C'. No hay excepciones en 'C'. – pmg

+0

Mire a través de la fuente de varias excepciones que arrojan excepciones (no se puede pensar en nada brusco ... cerebro frito), y vea qué usan. –

+1

@pmg No el lenguaje C no tiene un concepto para try/catch ... pero PHP5 sí, entonces tiene que haber una función zend_ o php_ API que arroje una excepción desde la extensión a un script PHP – David

Respuesta

7

Miré el código fuente para la extensión Sqlite de PHP 5.3, específicamente Sqlite.c que sabía inició una excepción y se encontró

través sqlite - https://github.com/php/php-src/blob/PHP-5.3/ext/sqlite/sqlite.c#L46

#include "zend_exceptions.h" 

En zend_exceptions.h, se ve como un RuntimeException puede elevarse a través de una simple llamada a

zend_throw_exception(NULL, "Some text") 

como se explica aquí https://github.com/php/php-src/blob/PHP-5.3/Zend/zend_exceptions.h#L43

La extensión Sqlite3 lo usa de esta manera:

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

donde infiero que zend_exception_get_default() Obtiene una referencia/manejar a RuntimeException, el segundo argumento es el mensaje de excepción, y el resto del trabajo se delega.

Cuestiones relacionadas