]> granicus.if.org Git - php/commitdiff
Allow to throw instances of classes derived from exception
authorMarcus Boerger <helly@php.net>
Sun, 24 Aug 2003 15:07:00 +0000 (15:07 +0000)
committerMarcus Boerger <helly@php.net>
Sun, 24 Aug 2003 15:07:00 +0000 (15:07 +0000)
Zend/zend_default_classes.c
Zend/zend_default_classes.h
Zend/zend_exceptions.c
Zend/zend_exceptions.h

index a00d261ea7b6d6e575695e30aba0c82c79d15a2c..116dbabe193e22ddada682b45bcc3b0dea4923d0 100644 (file)
@@ -136,18 +136,27 @@ ZEND_API zend_class_entry *zend_exception_get_default(void)
        return default_exception_ptr;
 }
 
-ZEND_API void zend_throw_exception(char *message, long code TSRMLS_DC)
+ZEND_API void zend_throw_exception(zend_class_entry *exception_ce, char *message, long code TSRMLS_DC)
 {
        zval *ex;
 
        MAKE_STD_ZVAL(ex);
-       object_init_ex(ex, default_exception_ptr);
+       if (exception_ce) {
+               if (!instanceof_function(exception_ce, default_exception_ptr TSRMLS_CC)) {
+                       zend_error(E_NOTICE, "Exceptions must be derived from exception");
+                       exception_ce = default_exception_ptr;
+               }
+       } else {
+               exception_ce = default_exception_ptr;
+       }
+       object_init_ex(ex, exception_ce);
+       
 
        if (message) {
-               zend_update_property_string(default_exception_ptr, ex, "message", sizeof("message")-1, message TSRMLS_CC);
+               zend_update_property_string(exception_ce, ex, "message", sizeof("message")-1, message TSRMLS_CC);
        }
        if (code) {
-               zend_update_property_long(default_exception_ptr, ex, "code", sizeof("code")-1, code TSRMLS_CC);
+               zend_update_property_long(exception_ce, ex, "code", sizeof("code")-1, code TSRMLS_CC);
        }
 
        EG(exception) = ex;
index 31b1b4365c875d9bfb7d4907fcb99b9efe713333..0e1d70f26ade287d8bb22652621d626d3f70432c 100644 (file)
@@ -13,6 +13,7 @@
    | license@zend.com so we can mail you a copy immediately.              |
    +----------------------------------------------------------------------+
    | Authors: Sterling Hughes <sterling@php.net>                          |
+   |          Marcus Boerger <helly@php.net>                              |
    +----------------------------------------------------------------------+
 */
 
 BEGIN_EXTERN_C()
 
 ZEND_API zend_class_entry *zend_exception_get_default(void);
-ZEND_API void zend_throw_exception(char *message, long code TSRMLS_DC);
 ZEND_API void zend_register_default_classes(TSRMLS_D);
+
+/* exception_ce   NULL or zend_exception_get_default() or a derived class 
+ * message        NULL or the message of the exception */
+ZEND_API void zend_throw_exception(zend_class_entry *exception_ce, char *message, long code TSRMLS_DC);
+
+/* show an exception using zend_error(E_ERROR,...) */
 ZEND_API void zend_exception_error(zval *exception TSRMLS_DC);
-       
+
 END_EXTERN_C()
 
 #endif
index a00d261ea7b6d6e575695e30aba0c82c79d15a2c..116dbabe193e22ddada682b45bcc3b0dea4923d0 100644 (file)
@@ -136,18 +136,27 @@ ZEND_API zend_class_entry *zend_exception_get_default(void)
        return default_exception_ptr;
 }
 
-ZEND_API void zend_throw_exception(char *message, long code TSRMLS_DC)
+ZEND_API void zend_throw_exception(zend_class_entry *exception_ce, char *message, long code TSRMLS_DC)
 {
        zval *ex;
 
        MAKE_STD_ZVAL(ex);
-       object_init_ex(ex, default_exception_ptr);
+       if (exception_ce) {
+               if (!instanceof_function(exception_ce, default_exception_ptr TSRMLS_CC)) {
+                       zend_error(E_NOTICE, "Exceptions must be derived from exception");
+                       exception_ce = default_exception_ptr;
+               }
+       } else {
+               exception_ce = default_exception_ptr;
+       }
+       object_init_ex(ex, exception_ce);
+       
 
        if (message) {
-               zend_update_property_string(default_exception_ptr, ex, "message", sizeof("message")-1, message TSRMLS_CC);
+               zend_update_property_string(exception_ce, ex, "message", sizeof("message")-1, message TSRMLS_CC);
        }
        if (code) {
-               zend_update_property_long(default_exception_ptr, ex, "code", sizeof("code")-1, code TSRMLS_CC);
+               zend_update_property_long(exception_ce, ex, "code", sizeof("code")-1, code TSRMLS_CC);
        }
 
        EG(exception) = ex;
index 31b1b4365c875d9bfb7d4907fcb99b9efe713333..0e1d70f26ade287d8bb22652621d626d3f70432c 100644 (file)
@@ -13,6 +13,7 @@
    | license@zend.com so we can mail you a copy immediately.              |
    +----------------------------------------------------------------------+
    | Authors: Sterling Hughes <sterling@php.net>                          |
+   |          Marcus Boerger <helly@php.net>                              |
    +----------------------------------------------------------------------+
 */
 
 BEGIN_EXTERN_C()
 
 ZEND_API zend_class_entry *zend_exception_get_default(void);
-ZEND_API void zend_throw_exception(char *message, long code TSRMLS_DC);
 ZEND_API void zend_register_default_classes(TSRMLS_D);
+
+/* exception_ce   NULL or zend_exception_get_default() or a derived class 
+ * message        NULL or the message of the exception */
+ZEND_API void zend_throw_exception(zend_class_entry *exception_ce, char *message, long code TSRMLS_DC);
+
+/* show an exception using zend_error(E_ERROR,...) */
 ZEND_API void zend_exception_error(zval *exception TSRMLS_DC);
-       
+
 END_EXTERN_C()
 
 #endif