【问题标题】:How to catch all errors in rust?如何捕获 rust 中的所有错误?
【发布时间】:2021-02-24 05:12:02
【问题描述】:

我是 rust 新手,我写了一个函数,它返回一个带有 Box dyn 错误的结果。

use std::error::Error;

fn func<T>(val: T) -> Result<(), Box<dyn Error>>
where
    T: std::fmt::Debug,
{
    println!("{:?}", val);    
    Ok(())
}

fn main() {
    func("hello world");
}

这里我没有在函数func 中编写任何错误逻辑,但它仍然有效。上面的代码会自动捕获所有错误吗?类似于python的

try:
  # Run the code
except:
  # Catch all the errors

rust 有什么通用的错误捕获方法吗?

【问题讨论】:

    标签: error-handling rust


    【解决方案1】:

    如果您对此运行cargo clippy,您将收到以下警告:

    warning: unused `std::result::Result` that must be used
      --> src/main.rs:12:5
       |
    12 |     func("hello world");
       |     ^^^^^^^^^^^^^^^^^^^^
       |
    

    这告诉你,虽然func 返回一个可能是错误的Result,但你并没有对它做任何事情。

    您需要处理错误 - 最简单的方法是更改​​ main 以返回错误:

    fn main() -> Result<(), Box<dyn Error>> {
        func("hello world")?; // If this fails, the `?` makes main return it
        Ok(())
    }
    

    现在func 失败,main 也会失败。

    要查看此操作,我们需要一个错误类型 - 实现起来有点乏味(例如,请参阅 here 了解详细信息)。相反,我将转换为使用 anyhow 处理错误。

    use anyhow::{anyhow, Result};
    
    fn func<T>(val: T) -> Result<()>
    where
        T: std::fmt::Debug,
    {
        println!("{:?}", val);    
        Err(anyhow!("BANG"))
    }
    
    fn main() -> Result<()> {
        func("hello world")?;
        Ok(())
    }
    

    现在func 返回错误,并运行二进制输出:

    "hello world"
    Error: BANG
    

    如果你不希望你的应用程序出错退出,或者不希望它以这种方式退出,那么你需要自己处理来自func的结果

    use anyhow::{anyhow, Result};
    
    fn func<T>(val: T) -> Result<()>
    where
        T: std::fmt::Debug,
    {
        println!("{:?}", val);    
        Err(anyhow!("BANG"))
    }
    
    fn main() {
        match func("hello world") {
          Err(e) => println!("an error: {:?}", e), //<= error handling
          Ok(_) => println!("func was OK"),
        }
    }
    

    将输出:

    "hello world"
    an error: BANG
    

    【讨论】:

      猜你喜欢
      • 2015-01-30
      • 1970-01-01
      • 1970-01-01
      • 2017-08-14
      • 2016-12-07
      • 1970-01-01
      • 2017-07-06
      • 2015-12-18
      • 2011-08-20
      相关资源
      最近更新 更多