Macro python_comm::raise_error [−][src]
macro_rules! raise_error {
("py", $func : ident, $text : expr, "\n", $err : expr) => { ... };
($func : ident, $text : expr, "\n", $err : expr) => { ... };
($func : ident, "\n", $err : expr) => { ... };
($func : ident, $text : expr) => { ... };
}
Expand description
Generate pyo3:: pyerr or anyhow:: error with file name, line number and function
Usage
use pyo3::{prepare_freethreaded_python, Python};
use python_comm::raise_error_use::*;
use python_comm_macros::auto_func_name;
prepare_freethreaded_python();
let gil = Python::acquire_gil();
let py = gil.python();
#[auto_func_name]
fn test(py:Python) -> Result<(), anyhow::Error> {
let v = Ok(2).and(Err("e"));
// Usage 1: generate pyo3::PyErr
let _a = v.or_else(|err| raise_error!("py", __func__, "some text", "\n", err));
// Usage 2: generate anyhow::Error, including supplementary instruction and another error
let b = v.or_else(|err| raise_error!(__func__, "some text", "\n", err));
// Usage 3: generate anyhow::Error, including another error
let _c = v.or_else(|err| raise_error!(__func__, "\n", err));
// Usage 4: generate anyhow::Error, including supplementary description
let _d = v.or_else(|_err| Err(raise_error!(__func__, "some text")));
b
}
let err = format!("{:?}", test(py).err().unwrap());
let msg1 = "Error: src\\macros.rs:21 test() some text\n\"e\"";
let msg2 = "Error: src/macros.rs:21 test() some text\n\"e\"";
assert!(err == msg1 || err == msg2, "\n left: {:?}\n msg1:{:?}\n msg2:{:?}", err, msg1, msg2);