rust - 使用 pyo3 引发异常
问题描述
如何正确引发异常?
我尝试了以下方法:
#[pymethods]
impl Foo {
#[new]
fn __new__(arg1: u8, ...) -> Self {
if arg1 > LIMIT {
let gil = Python::acquire_gil();
let py = gil.python();
PyErr::new::<exceptions::ValueError, _>("Parameter arg1 has invalid value").restore(py);
}
Foo {...}
}
这与此处描述的实现方式完全相同。
当我创建一个Foo
具有无效参数值的实例时,而不是ValueError
aSystemError
引发错误文本<class 'Foo'> returned a result with an error set
。
我在 Linux 上每晚使用 pyo3 0.11.1 和 Rust 1.47.0。
解决方案
您可以使用 aPyResult
返回异常(将在 python 中引发):
#[pymethods]
impl Foo {
#[new]
fn __new__(arg1: u8, ...) -> PyResult<Self> {
if arg1 > LIMIT {
Err(exceptions::PyValueError::new_err("Parameter arg1 has invalid value"))
} else {
Ok(Foo {...})
}
}
推荐阅读
- javascript - React redux 无法正确调度
- gradle - Gradle onlyIf 任务条件不起作用
- ios - 如何防止 ERR_TIMEOUT 来自 Epson TM-m30 热敏行式打印机在使用 SDK for iOS 的打印进度中出现超时错误?
- laravel - 如何在 Laravel 中测试由服务创建的 cookie
- php - 用 php 创建特定的 json 结构
- nginx - Nginx proxy_pass 在变量中定义目标时改变行为
- javascript - HTML input type="file" onchange="form.submit()" 不适用于 Flask
- mysql - mysql二进制在性能上比char好?
- c++ - 从 bmp 图像打印像素数组
- python - 带索引的字典理解