3

如何正确引发异常?

我尝试了以下方法:

#[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。

4

2 回答 2

2

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

于 2020-07-28T08:01:03.503 回答
2

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

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

正如ctors 所记录的以及在引发异常的第一个片段之后所指出的那样,您应该返回 a [Py]Result,其中Errcase 表示 pyo3 将为解释器设置的错误。

于 2020-07-28T07:16:05.973 回答