Expand description
Checked EXceptions for Rust.
See the enumx book for more.
§Features
-
Use
Result!( Type throws A,B,.. )
,ret!()
,throw!()
to simulate checked exceptions in Rust -
#[ty_pat] match
for “type as pattern matching” in match expressions. -
Optional backtrace support.
-
Fallback as
impl std::error::Error
.
§Examples
use enumx::export::*;
use enumx::predefined::*;
use cex::*;
// accepts even numbers; rejects odd ones and report an error `String`
#[cex]
fn check_even( a: u32 ) -> Result!( u32 throws String ) {
if a % 2 == 1 {
throw!( format!( "odd numbers not allowed: a == {}", a ));
} else {
ret!( a );
}
}
// accepts non-zero numbers; rejects zeros and report an error of `&'static str`
#[cex]
fn check_nonzero( b: u32 ) -> Result!( u32 throws &'static str ) {
if b == 0 {
throw!( "zero not allowed: b == 0" );
} else {
ret!( b )
}
}
struct Underflow;
#[cex]
fn sub( a: u32, b: u32 ) -> Result!( u32 throws String, &'static str, Underflow ) {
let a = check_even( a )?;
let b = check_nonzero( b )?;
ret!( a+b );
}
#[cex]
fn distance( a: u32, b: u32 ) -> Result!( u32 throws String, &'static str ) {
ret!( sub(a,b).or_else( |err| {#[ty_pat] match err {
Underflow => ret!( b-a ),
String(s) => throw!( s ),
TyPat::<&'static str>(s) => throw!( s ),
}}))
}
#[cex]
fn distance2( a: u32, b: u32 ) -> Result!( u32 throws String, &'static str ) {
ret!( sub(a,b).or_else( |err| #[ty_pat(gen_throws)] match err {
Underflow => ret!( b-a ),
}))
}
#[cex]
fn distance3( a: u32, b: u32 ) -> Result!( u32 throws String, &'static str ) {
ret!( sub(a,b).or_else( |err| #[ty_pat(gen &'static str, String )] match err {
Underflow => ret!( b-a ),
}))
}
Re-exports§
Modules§
- Backtrace
- Traits and types to support
ret!()
/throw!()
and backtrace in a#[cex]
fn.
Macros§
Result!()
macro- This is for trait’s associated type that is an error. Don’t use it in cex function signature, use
Result!()
. - Help to define a summarizing error type of the crate. The crate error should not appear in cex function’s signature, but for downstream users of cex functions, who do not want to adopt checked exceptions.
- A macro to generate a
Frame
, to store the source of the error with file name, module path, line/column numbers, and an optional context info, using the same syntax withformat!()
. - Help to implement
std::error::Error
for errors that have already implementedstd::fmt::Debug
.
Traits§
- Enum exchange to wrap an
Err
. - Enum exchange for
Err
combinator.
Attribute Macros§
- tag an
fn
with#[cex]
to: