我应该使用哪些类项来抛出来自C扩展的非默认异常


What class entries should I use to throw non-default exceptions from a C extension?

在我的C扩展,我可以抛出一个PHP异常与zend_throw_exception调用函数。该函数的第一个参数是zend_class_entry,它指定要抛出的异常类型。我从zend_exceptions.h的文档中知道,我可以使用zend_exception_get_default()来使用默认的异常类型。

但是,它也说我可以传递一个派生类。我在哪里可以找到派生的内置异常的类条目,例如InvalidArgumentException ?

所有异常都在源代码中定义;

 php-5.5.15/ext/spl/spl_exceptions.h

,可以在您安装devel包时在这里找到(例如fedora上的yum install php-devel);

 /usr/include/php/ext/spl/spl_exceptions.h

并包含以下内容;

extern PHPAPI zend_class_entry *spl_ce_LogicException;
extern PHPAPI zend_class_entry *spl_ce_BadFunctionCallException;
extern PHPAPI zend_class_entry *spl_ce_BadMethodCallException;
extern PHPAPI zend_class_entry *spl_ce_DomainException;
extern PHPAPI zend_class_entry *spl_ce_InvalidArgumentException;
extern PHPAPI zend_class_entry *spl_ce_LengthException;
extern PHPAPI zend_class_entry *spl_ce_OutOfRangeException;
extern PHPAPI zend_class_entry *spl_ce_RuntimeException;
extern PHPAPI zend_class_entry *spl_ce_OutOfBoundsException;
extern PHPAPI zend_class_entry *spl_ce_OverflowException;
extern PHPAPI zend_class_entry *spl_ce_RangeException;
extern PHPAPI zend_class_entry *spl_ce_UnderflowException;
extern PHPAPI zend_class_entry *spl_ce_UnexpectedValueException;

和可以根据单元测试被抛出,如;

zend_throw_exception_ex(spl_ce_InvalidArgumentException, 0 TSRMLS_CC, "array size cannot be less than zero");