Crate cex[][src]

Checked EXceptions for Rust.

See the enumx book for more.

Features

  1. Use Result!( Type throws A,B,.. ), ret!(), throw!() to simulate checked exceptions in Rust

  2. #[ty_pat] match for “type as pattern matching” in match expressions.

  3. Optional backtrace support.

  4. 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

pub use result::*;
pub use self::log::*;

Modules

log

Backtrace

result

Traits and types to support ret!()/throw!() and backtrace in a #[cex] fn.

Macros

Result

Result!() macro

Throws

This is for trait’s associated type that is an error. Don’t use it in cex function signature, use Result!().

crate_error

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.

frame

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 with format!().

impl_std_error

Help to implement std::error::Error for errors that have already implemented std::fmt::Debug.

Traits

Error

Enum exchange to wrap an Err.

MapError

Enum exchange for Err combinator.

Attribute Macros

cex

tag an fn with #[cex] to: