Tôi gặp một số sự cố khi xử lý các ngoại lệ C++ tùy chỉnh khi gọi từ Cython. Tình huống của tôi là như sau: Tôi có một thư viện sử dụng CustomLibraryException
cho tất cả các trường hợp ngoại lệ. Những gì tôi muốn về cơ bản là nhận được thông báo lỗi và đưa ra một lỗi Python với nó.Xử lý các ngoại lệ C++ tùy chỉnh trong Cython
user guide có một số gợi ý nhưng có một chút không xác định. Khả năng thứ nhất là để làm:
CDEF int bar() trừ + ValueError
này chuyển đổi CustomLibraryException
đến một ValueError
, nhưng mất thông báo lỗi.
Khả năng khác là chuyển đổi một cách rõ ràng các lỗi sử dụng
cdef int raise_py_error()
cdef int something_dangerous() except +raise_py_error
tôi không thực sự understant giải pháp này. Tôi hiểu rằng raise_py_error phải là một hàm C++ mà bằng cách nào đó xử lý lỗi. Tôi không chắc chắn làm thế nào để xử lý nó mặc dù. Hàm không nhận được đối số và được gọi bên trong khối catch
trong C++.
Nếu có ai có ví dụ làm việc về xử lý ngoại lệ C++ trong Cython, điều đó sẽ giúp ích rất nhiều.
Ngoại lệ không xuất phát từ '' std :: runtime'' như bạn mong đợi. Cảm ơn sự giúp đỡ :) Điều đó không làm cho nó tốt hơn nhiều, mặc dù. Các hàm nâng lỗi là các hàm thành viên và tôi không muốn thay đổi mã của chúng. Đây là về [gco wrappers] của tôi (http://peekaboo-vision.blogspot.de/2012/05/graphcuts-for-python-pygco.html) và giấy phép không cho phép tôi phân phối lại: -/ –
@ AndreasMueller: các hàm thành viên có thể được bao bọc một cách dễ dàng trong các hàm freestanding; chỉ cần truyền đối tượng mà chúng sẽ hoạt động như đối số đầu tiên: 'void wrapper (Obj & o, int ham) {return o.wrapped (ham); } ' –
Vâng tôi biết, tôi chỉ lười biếng để làm điều đó được nêu ra;) Btw, bạn có biết bạn là tấm poster thứ 100 trên SO? –