2010-09-02 26 views
5

Tôi đã viết trình bao bọc Perl XS cho thư viện C bao gồm khoảng ~ 80 chức năng. Ngay bây giờ chiến lược chung của tôi là thay thế lỗi từ một hàm C với PL_sv_undef và mã Perl đang gọi phải kiểm tra rõ ràng cho dù lợi nhuận không phải là undef. (Đối với một số chức năng C nó là phức tạp hơn như tôi chuyển đổi sản lượng của họ vào một HV/AV và sử dụng danh sách trống để báo cáo lỗi.)XSUB của Perl có thể chết như thế nào?

Bây giờ khi tôi chuyển sang viết kịch bản Perl lớn hơn sử dụng thư viện đó, tôi muốn đơn giản hóa việc xử lý lỗi và sử dụng ví dụ cơ chế eval {}/die ngoại lệ giống như để xử lý lỗi.

Tại thời điểm một XSUB đơn giản trong XS của tôi trông như thế:

SV * 
simple_function(param1, param2 = 0, param3 = 0) 
     int    param1 
     int    param2 
     int    param3 
     CODE: 
       int rc; 
       rc = simple_function(param1, param2, param3); 
       RETVAL = (rc == 0) ? &PL_sv_yes : &PL_sv_undef; 
     OUTPUT: 
       RETVAL 

Tôi đã thấy rằng một số module có cờ toàn cầu như "RaiseError" để die trên lỗi nhưng không tìm thấy bất kỳ ví dụ tôi có thể mượn từ. Vài mô-đun tôi đã tìm thấy xử lý cờ "RaiseError" bên trong .pm, không phải bên trong .xs và do đó được phép sử dụng số die của Perl. Trong trường hợp của tôi là khá khó khăn để thực hiện bên trong các .pm như nhiều chức năng yêu cầu kiểm tra lỗi đặc biệt. Điều đó cũng sẽ dẫn đến trùng lặp mã khi kiểm tra đã có mặt bên trong XS.

Tôi không tìm thấy nội dung nào có liên quan trong tài liệu perlxs/perlguts. Đặc biệt, tôi đã thấy các cuộc gọi tới số Perl_croak() trong số .c được tạo từ số .xs của mình, nhưng không thể tìm thấy bất kỳ tài liệu nào cho hàm đó.

Tương tự XS của Perl là die là gì? Hoặc báo cáo XSUB khác có thể hoạt động như thế nào với Perl thời gian chạy mà chức năng đã thất bại và không có RETVAL trả lại? Làm cách nào để đặt đúng số [email protected]?

Trả lời

6

Perl_croak() được ghi lại here trên trang người đàn ông perlapi. Như ví dụ trên trang đó cho thấy, bạn có thể truyền cho nó một chuỗi tin nhắn, hoặc bạn có thể tự đặt $ @ cho một đối tượng ngoại lệ và truyền NULL.

+0

Chỉ một câu hỏi. Tại sao * chết * và không * chết *? Hay đó là một trí thông minh của Larry? – Dummy00001

+1

Không, [Zefram] (http://search.cpan.org/~zefram) 's. Đó là cách sử dụng [hackish] (http://catb.org/jargon/html/writing-style.html) vì nó xuất phát từ từ khóa 'die'. – daxim

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