首页 > 解决方案 > 使用 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具有无效参数值的实例时,而不是ValueErroraSystemError引发错误文本<class 'Foo'> returned a result with an error set

我在 Linux 上每晚使用 pyo3 0.11.1 和 Rust 1.47.0。

标签: rustpyo3

解决方案


您可以使用 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 {...})
        }
    }


推荐阅读