macro_rules! create_exception {
    ($module: expr, $name: ident, $base: ty) => { ... };
    ($module: expr, $name: ident, $base: ty, $doc: expr) => { ... };
}Expand description
Defines a new exception type.
§Syntax
- moduleis the name of the containing module.
- nameis the name of the new exception type.
- baseis the base class of- MyError, usually- PyException.
- doc(optional) is the docstring visible to users (with- .__doc__and- help()) and
accompanies your error type in your crate’s documentation.
§Examples
use pyo3::prelude::*;
use pyo3::create_exception;
use pyo3::exceptions::PyException;
create_exception!(my_module, MyError, PyException, "Some description.");
#[pyfunction]
fn raise_myerror() -> PyResult<()> {
    let err = MyError::new_err("Some error happened.");
    Err(err)
}
#[pymodule]
fn my_module(m: &Bound<'_, PyModule>) -> PyResult<()> {
    m.add("MyError", m.py().get_type::<MyError>())?;
    m.add_function(wrap_pyfunction!(raise_myerror, m)?)?;
    Ok(())
}Python code can handle this exception like any other exception:
from my_module import MyError, raise_myerror
try:
    raise_myerror()
except MyError as e:
    assert e.__doc__ == 'Some description.'
    assert str(e) == 'Some error happened.'