【问题标题】:Raising an exception with pyo3使用 pyo3 引发异常
【发布时间】:2020-07-28 06:12:35
【问题描述】:

如何正确引发异常?

我尝试了以下方法:

#[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 {...}
    }

这与here 的描述完全相同。

当我使用无效参数值创建Foo 的实例时,会引发SystemError 而不是SystemError,并带有错误文本&lt;class 'Foo'&gt; returned a result with an error set。

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

【问题讨论】:

    标签: rust pyo3


    【解决方案1】:

    您可以使用PyResult 来返回异常(将在 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 {...})
            }
        }
    
    

    【讨论】:

    • 非常感谢!有用!不知道我可以在 new 方法中返回 PyResult。
    【解决方案2】:

    请注意,您链接到的示例是关于 main 中的错误管理。

    我相信,正如SystemError 所指出的那样,您同时设置了一个错误并返回一个值。由于这些显然是排他性条件(引发 和 返回是没有意义的),Python 解释器会出错。

    正如documented for ctors 以及raising an exception 的第一个sn-p 之后所指出的,您应该返回一个[Py]Result,Err 表示一个错误,pyo3 将为解释器设置一个错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-11-07
      • 1970-01-01
      • 1970-01-01
      • 2014-10-25
      • 2014-11-20
      • 1970-01-01
      • 2016-02-28
      • 1970-01-01
      相关资源
      最近更新 更多