2010-10-14 19 views
6

Một đồng nghiệp khác và tôi đã sửa đổi phần mở rộng của PHP Zookeeper nhưng một điều thực sự làm phiền tôi là sự phụ thuộc vào lỗi PHP so với Ngoại lệ.Ném ngoại lệ thay vì lỗi từ phần mở rộng của PHP

Nguồn gốc là ở đây: http://github.com/andreiz/php-zookeeper/blob/master/php_zookeeper.c#L209

Thay vào đó nó sẽ đẹp hơn để ném lên một Zookeeper_NodeNotExists hoặc tương tự, ngoại trừ tôi không có ý kiến ​​gì thì gọi API trong c là.

Tôi đã thử googling và có một tập hợp kết quả dồi dào của ngoại lệ trong ngôn ngữ PHP, hướng dẫn sử dụng PHP dường như không đề cập đến chúng, và tôi không thể nhớ phần mở rộng cổ phiếu PHP ném ngoại lệ cho bạn. Có một nguồn tài liệu thay thế nào trên API PHP/Zend c không?

+0

Lần cuối cùng tôi xem (đã lâu rồi) PHP được viết bằng 'C'. Không có ngoại lệ trong 'C'. – pmg

+0

Xem qua nguồn gốc của các ngoại lệ khác nhau mà làm ném ngoại lệ (không thể nghĩ ra bất kỳ offhand ... não chiên), và xem những gì họ sử dụng. –

+1

@pmg Không ngôn ngữ C nào không có khái niệm về try/catch ... nhưng PHP5 có, do đó, phải có hàm zend_ hoặc php_ API ném ngoại lệ từ phần mở rộng sang tập lệnh PHP – David

Trả lời

7

tôi nhìn vào mã nguồn cho phần mở rộng Sqlite PHP 5.3 của, đặc biệt Sqlite.c mà tôi biết đã ném một ngoại lệ và thấy

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

#include "zend_exceptions.h" 

Trong zend_exceptions.h, nó trông giống như một RuntimeException có thể được nâng lên thông qua một cuộc gọi đơn giản để

zend_throw_exception(NULL, "Some text") 

như đã giải thích ở đây https://github.com/php/php-src/blob/PHP-5.3/Zend/zend_exceptions.h#L43

Việc gia hạn Sqlite3 sử dụng nó như vậy:

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

nơi tôi suy ra rằng zend_exception_get_default() nhận được một tài liệu tham khảo/xử lý để RuntimeException, đối số thứ 2 là thông điệp ngoại lệ, và tất cả các công việc khác được giao.

Các vấn đề liên quan