铁 rust ,慌后有行动

fdbelqdn  于 2023-02-04  发布在  其他
关注(0)|答案(1)|浏览(108)

我有关于在恐慌后采取行动的问题!.我有很强的经验与python,我经常使用:

try:
   do_something()
exception:
   do_something_else()

但不能这样做 rust .我的代码如下:

fn do_something(value: u32) -> Result<u32, io::Error> {
    if value > 30 {
        panic!("Value is bigger then 30!");
    }
    else {
        Ok(value)
    }
}
// first try
fn if_else_catch(value: u32) -> Result<u32, u32> {
    let result = do_something(value);
    let something = match result {
        Ok(something) => something + something,
        Err(err) => do_something_else(),
    };

    Ok(something)
}

fn if_else_catch_retun_different_value(value: u32) -> Result<u32, u32> {
    let result = do_something(value);
    let something = match result {
        Ok(something) => something + something,
        Err(err) => 100,
    };

    Ok(something)
}
// another try
fn do_something_else_with_questionmark(value: u32) -> Result<u32, io::Error> {
    let result = do_something(value)?;
    if let Err(_err) = do_something(value) {
        println!("An Error occured!");
    }
    Ok(result)
}

fn main() {
    println!("Do something: {}", do_something(35).unwrap());
    println!("Do something res: {}", if_else_catch(35).unwrap());
}

有可能做到吗?我该如何实施?
我已经检查了文档,但这样的例子:
一个二个一个一个
对这个案子没用。

brccelvz

brccelvz1#

在您的错误用例中,很自然的事情就是返回一个Err

use std::io::{Error, ErrorKind};

fn do_something(value: u32) -> Result<u32, Error> {
    if value > 30 {
        Err(Error::new(ErrorKind::Other, "Value is bigger than 30!"))
    } else {
        Ok(value)
    }
}

如果确实需要,可以使用catch_unwind从死机中恢复,但是

建议将此函数用于一般的try/catch机制。Result类型更适合用于可能定期失败的函数。此外,此函数不保证捕获所有异常。

use std::panic::catch_unwind;
fn catch_it(value: u32) -> Result<u32, u32> {
    let result = catch_unwind(|| do_something(value));
    let something = match result {
        Ok(Ok(something)) => something + something,
        Ok(Err(_)) | Err(_) => do_something_else(),
    };

    Ok(something)
}

相关问题