我已经用py03将一些Python重写成了Rust.在我使用的第三方Rust库中的某个地方,我的Rust代码可能会死机.对我来说,最简单的事情就是在Python领域捕捉到这种panic ,并退回到速度较慢(但更有弹性)的Python方法.这种失败是非常罕见的,以至于退回到Python仍然比只使用Python更高效.有没有办法应对铁 rust panic ?根据我所读到的,答案可能是"不",但我希望!
下面是我的意思的简化示例.如有任何帮助,我们不胜感激!
(我知道我可以/可以追查到每一次panic 的具体原因,但我认为这个问题无论如何都有道理.)
lib.rs个
use numpy::{IntoPyArray, PyArray1, PyReadonlyArray1};
use pyo3::{pymodule, types::PyModule, PyResult, Python};
#[pymodule]
fn can_panic(_py: Python, m: &PyModule) -> PyResult<()> {
#[pyfn(m)]
fn can_panic<'py>(
py: Python<'py>,
arr: PyReadonlyArray1<i64>,
) -> &'py PyArray1<bool> {
let my_arr = arr.as_array();
for v in my_arr {
if v == &-1 {
panic!("Hey, you can't do that!");
}
}
vec![true; my_arr.len()].into_pyarray(py)
}
Ok(())
}
Cargo.toml个
[package]
name = "can_panic"
version = "0.1.0"
edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[lib]
name = "can_panic"
crate-type = ["cdylib"]
[dependencies]
pyo3 = { version = "0.18.3", features = ["extension-module", "anyhow"] }
numpy = "0.18.0"
nalgebra = "0.32.2"
testing.py个
import numpy as np
import can_panic
print("Staring filtering")
print(can_panic.can_panic(np.array([1, 2, 3], dtype="int64")))
print("Done filtering")
print("Staring Filtering")
try:
print(can_panic.can_panic(np.array([-1, 2, 3], dtype="int64")))
except Exception:
print("didn't work")
# call Python equivalent
print("Done filtering")
output个
Staring filtering
[ True True True]
Done filtering
Staring Filtering
thread '<unnamed>' panicked at 'Hey, you can't do that!', src/lib.rs:16:17
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
Traceback (most recent call last):
File "(snip...)/can_panic/testing.py", line 13, in <module>
print(can_panic.can_panic(np.array([-1, 2, 3], dtype="int64")))
pyo3_runtime.PanicException: Hey, you can't do that!