Tôi đang triển khai mô-đun mở rộng Python bằng cách sử dụng Boost.Python. Mô-đun sẽ xác định các lớp ngoại lệ tùy chỉnh của riêng nó kế thừa Exception
. Làm thế nào để làm điều đó?Boost.Python lớp ngoại lệ tùy chỉnh
Trả lời
Hàm sau tạo một lớp ngoại lệ Python mới và thêm nó vào phạm vi hiện tại. Nếu nó được gọi trong hàm khởi tạo mô-đun, thì nó sẽ được thêm vào mô-đun.
Đối số đầu tiên là tên của lớp ngoại lệ mới. Đối số thứ hai là đối tượng kiểu cho lớp cơ sở của lớp ngoại lệ mới; nó mặc định là đối tượng kiểu cho Exception
. Giá trị trả về là đối tượng kiểu cho lớp ngoại lệ mới.
PyObject* createExceptionClass(const char* name, PyObject* baseTypeObj = PyExc_Exception)
{
using std::string;
namespace bp = boost::python;
string scopeName = bp::extract<string>(bp::scope().attr("__name__"));
string qualifiedName0 = scopeName + "." + name;
char* qualifiedName1 = const_cast<char*>(qualifiedName0.c_str());
PyObject* typeObj = PyErr_NewException(qualifiedName1, baseTypeObj, 0);
if(!typeObj) bp::throw_error_already_set();
bp::scope().attr(name) = bp::handle<>(bp::borrowed(typeObj));
return typeObj;
}
Sử dụng các chức năng như sau:
Gọi hàm trong các chức năng mô-đun khởi tạo và lưu trữ các giá trị trả về trong một biến toàn cầu:
PyObject* myExceptionTypeObj = 0;
BOOST_PYTHON_MODULE(MyModule)
{
...
myExceptionTypeObj = createExceptionClass("MyException");
...
}
Raise ngoại trừ loại MyModule.MyException
:
PyErr_SetString(myExceptionTypeObj, "Oh my!")
Nói 'MyException' thực sự ánh xạ thành kiểu C++. Làm cách nào để tôi phơi bày các thành viên của mình? – Barry
@Kenny:
Nếu bạn tham khảo
PyErr_SetString(myExceptionTypeObj, "Oh my!")
tôi sẽ không coi đây là "sao chép chuỗi đến một đối tượng toàn cầu". Thay vào đó, nó đặt chỉ báo lỗi nội bộ của Python để trình thông dịch sẽ tăng một cá thể của myExceptionTypeObj vào lần kiểm tra chỉ báo lỗi tiếp theo của nó.
Xử lý ngoại lệ của Python hoạt động với chỉ báo lỗi toàn cầu (theo chuỗi Python) và đây là cách thông thường để tăng ngoại lệ thông qua việc loại bỏ API C.
Việc tôi thực hiện nó là bạn an toàn nếu bạn giữ GIL tại thời điểm này và sẽ gây ra một ngoại lệ trong chuỗi Python mà mã C của bạn được nhập từ đó.
- 1. boost :: python Xuất ngoại lệ tùy chỉnh
- 2. Lớp Ngoại lệ tùy chỉnh - kéo dài từ Ngoại lệ hoặc Thowable?
- 3. Trả lại ngoại lệ tùy chỉnh
- 4. Ngoại lệ tùy chỉnh trong C++
- 5. Bắt nhiều ngoại lệ tùy chỉnh? - C++
- 6. Ném ngoại lệ tùy chỉnh trong Java
- 7. Tại sao tạo ngoại lệ tùy chỉnh?
- 8. Điều kiện ngoại lệ tùy chỉnh PostgreSQL
- 9. Xử lý ngoại lệ tùy chỉnh php
- 10. Tôi có nên lấy ngoại lệ tùy chỉnh từ Ngoại lệ hoặc ApplicationException trong .NET không?
- 11. Logback - đầu ra tùy chỉnh cho ngoại lệ
- 12. Ngoại lệ và lỗi tùy chỉnh NSException và NSError
- 13. Cách thêm ngoại lệ tùy chỉnh trên symfony2
- 14. Xử lý ngoại lệ tùy chỉnh - java Web Services
- 15. Cách tắt "Ngắt khi ngoại lệ được ném" cho các loại ngoại lệ tùy chỉnh
- 16. Nơi lưu trữ các lớp ngoại lệ tùy chỉnh trong dự án Grails?
- 17. Điểm của việc sử dụng lớp ngoại lệ tùy chỉnh trong php là gì?
- 18. Triển khai ngoại lệ tùy chỉnh trong Thư viện lớp di động
- 19. Cách xác định ngoại lệ tùy chỉnh trong Haskell?
- 20. Bắt ngoại lệ ArgumentTypeError từ hành động tùy chỉnh
- 21. Xử lý ngoại lệ tùy chỉnh trong Spring Security
- 22. Tùy chỉnh thử/bắt mẫu mã dựa trên ngoại lệ
- 23. Thực tiễn tốt này cho Ngoại lệ tùy chỉnh?
- 24. Bắt ngoại lệ tùy chỉnh từ Dịch vụ web ASMX
- 25. Xử lý các ngoại lệ C++ tùy chỉnh trong Cython
- 26. Trong DDD nơi để giữ ngoại lệ tùy chỉnh (ngoại lệ ứng dụng)? Trong tầng cơ sở hạ tầng?
- 27. Ngoại lệ tùy chỉnh: Phân biệt qua nhiều lớp con hoặc lớp đơn được sao lưu bằng enum?
- 28. Các lớp Lỗi ngoại lệ của Ruby
- 29. Boost.Python: Gọi lại đến các hàm lớp
- 30. Các lớp ngoại lệ Java
Làm cho lỗi của bạn được kế thừa từ 'Ngoại lệ'; 'StandardError' được sử dụng bởi các lỗi được tạo ra bởi các công cụ từ thư viện chuẩn python. – Daenyth
@Denyeny: Bạn nói đúng. Tôi đã sửa đổi câu hỏi. – user763305