Rust异常

17 次浏览
2024年07月15日创建

panic是线程级别,一个线程panic,其他线程可以继续服务。可以捕获panic让线程存活。发生panic,调用栈会展开,这是panic的默认处理行为。

catch_unwind()。

enum Result<T, E> {
    Ok(T),
    Err(E),
}

rust中Result的定义,可以理解为Result是个pair,left是成功时,right时失败时,而Ok(10);,则是Result的left被设置为10,Err("error")则是Reslt的right被设置为"error"。

下面的代码并不是打印expect中的内容:

fn main() {
    let success: Result<i32, &str> = Ok(10);
    let error: Result<i32, &str> = Err("not good");

    println!("{}", error.expect("format error not correct"));
}

?运算符的使用

在 Rust 中,使用 ? 运算符处理错误时,如果发生了错误,它会立即将错误返回给调用者,这类似于其他语言中的“重新抛出”(rethrow)异常的机制。

fn main() {
    match process(5) {
        Ok(_) => println!("Process succeeded"),
        Err(e) => println!("Process failed: {}", e),
    }

    match process(-1) {
        Ok(_) => println!("Process succeeded"),
        Err(e) => println!("Process failed: {}", e),
    }
}

fn check_param(param: i32) -> Result<(), &'static str> {
    if param > 0 {
        Ok(())
    } else {
        Err("Parameter must be greater than zero")
    }
}

fn process(param: i32) -> Result<(), &'static str> {
    // 使用 ? 运算符来简化错误处理
    check_param(param)?;

    // 如果 check_param 成功,继续执行下面的代码
    println!("Parameter is valid: {}", param);
    Ok(())
}

也就是说,在rust中,错误处理等逻辑基本都是Result类型返回了。