Macro python_comm::raise_error [−][src]
macro_rules! raise_error { ($python : expr, $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
生成带文件名、行号、函数的 cpython::PyErr 或 anyhow::Error
用法
use cpython::Python; use python_comm::prelude::*; use python_comm_macros::auto_func_name; 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")); // 用法1:生成 cpython::PyErr let _a = v.or_else(|err| raise_error!(py, __func__, "some text", "\n", err)); // 用法2:生成 anyhow::Error, 包含补充说明及另一个 error let b = v.or_else(|err| raise_error!(__func__, "some text", "\n", err)); // 用法3:生成 anyhow::Error, 包含另一个 error let _c = v.or_else(|err| raise_error!(__func__, "\n", err)); // 用法3:生成 anyhow::Error, 补充说明 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:19 test() some text\n\"e\""; let msg2 = "Error: src/macros.rs:19 test() some text\n\"e\""; assert!(err == msg1 || err == msg2, "\n left: {:?}\n msg1:{:?}\n msg2:{:?}", err, msg1, msg2);