您能否返回适用于任何可能的错误类型的结果?

2024-02-14

我想使用多个库,每个库都有自己的错误类型。我并不真正关心每个特定板条箱的错误类型,我想使用?习惯用法是使用那些返回 a 的 crate 的方法Result type.

我也不想解开这些值,如果遇到错误,这会导致恐慌。我可能只是想使用传播不同的错误?到顶部,如果我愿意的话,也许可以选择处理它们或忽略它们。

我不能这样做std::result::Result<T, E>因为我不知道返回的错误类型(就像我说的,每个板条箱都可以返回自己的错误)。

我知道 Rust 中没有“面向对象”的多态性,但有特征对象。由于在编译时无法知道特征对象的大小,因此我们必须将它们隐藏在某种指针后面,例如& or Box<_>.

错误实现的基本特征似乎是std::error::Error.

我见过的一件事是fn foo() -> Result<Blah, Box<dyn Error>>策略,它利用了特质对象的概念。

这种策略的问题是没有一个包返回装箱错误,这导致编译器抱怨同样的问题。

一个示例用例:

use native_tls::TlsConnector; // 0.2.3
use std::io::{Read, Write};
use std::net::TcpStream;

fn main() {
    match do_stuff() {
        Ok(string) => {
            println!("{}", string);
        }
        _ => {
            println!("Failed!");
        }
    }
}

fn do_stuff() -> Result<String, Box<(dyn std::error::Error + 'static)>> {
    let connector = TlsConnector::new()?;

    let stream = TcpStream::connect("jsonplaceholder.typicode.com:443")?;
    let mut stream = connector.connect("jsonplaceholder.typicode.com", stream)?;

    stream.write_all(b"GET /todos/1 HTTP/1.0\r\n\r\n")?;
    let mut res = vec![];
    stream.read_to_end(&mut res)?;
    String::from_utf8(res)
}

有一个简单的方法可以解决这个问题吗?我可以轻松地抽象出所有不同的错误并返回一个Result所以我可以使用? idiom?


您能否返回适用于任何可能的错误类型的结果?

你不能。从表面上看,这没有道理。通用类型有由函数的调用者选择,那么一个函数如何在没有被告知如何构造它的情况下创建一个由其他人选择的错误呢?


也就是说,你的问题很容易解决。你说:

所以我可以使用? idiom

If 你始终如一地这样做,你的程序编译:

let s = String::from_utf8(res)?;
Ok(s)

您还可以直接转换错误类型:

String::from_utf8(res).map_err(Into::into)

没有一个板条箱返回装箱错误,这导致编译器抱怨同样的问题

它不适合5您使用过的其他情况?,因此尚不清楚您为何做出此声明。

具体来说,Box<dyn Error> can 可以从任何实现的类型创建Error https://doc.rust-lang.org/std/boxed/struct.Box.html#impl-From%3CE%3E:

impl<'a, E: Error + 'a> From<E> for Box<dyn Error + 'a> {
    fn from(err: E) -> Box<dyn Error + 'a> {
        Box::new(err)
    }
}

The ?接线员呼叫From::from为你在幕后。

也可以看看:

  • 这个问号运算符是做什么用的? https://stackoverflow.com/q/42917566/155423
  • 如何手动返回 Result>? https://stackoverflow.com/q/51550167/155423
  • Rust 正确的错误处理(自动从一种错误类型转换为另一种带问号的错误类型) https://stackoverflow.com/q/48430836/155423
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

您能否返回适用于任何可能的错误类型的结果? 的相关文章

随机推荐

  • 如何使用 Pyinstaller 捆绑 .jar 文件

    你怎么获得py安装程序 http www pyinstaller org将 jar 文件捆绑为使用它们的 python 项目的档案 例如 要制作一个 exe 文件 我正在使用pyjnius http pyjnius readthedocs
  • 如何将 Integer 转换为 int?

    我正在开发一个网络应用程序 其中数据将在客户端和服务器端之间传输 我已经知道 JavaScript int Java int 因为 Java int 不能为 null 对吧 现在这就是我面临的问题 我将 Java int 变量更改为 Int
  • Android Lollipop 中是否可能有一个不共存的“个人资料所有者”应用程序

    Lollipop API 提供了 2 个新功能 配置文件所有者 和 设备所有者 http developer android com about versions android 5 0 html Enterprise http devel
  • Spring-MVC控制器中触发404?

    我如何获得Spring http en wikipedia org wiki Spring Framework3 0控制器触发404 我有一个控制器 RequestMapping value method RequestMethod GET
  • Android 的氛围

    首先 我打算使用气氛 https github com Atmosphere atmosphere在服务器端和客户端都有一个带有 WebView 的 Android 应用程序 我将在其中使用 jQuery 但是 稍后计划推出更 标准 的 A
  • SSRS 包含或类似表达式

    我正在尝试从数据集中的字段创建计算表达式 我需要从一个字段中查找包含 交易所交易 一词的所有内容 并且在我的新字段中包含 ETF 13F 一词 如果没有任何匹配 那么它就只是空白 我已经尝试过喜欢 交易所交易 并包含 交易所交易 函数 并且
  • 使用进程生成器或 apache commons exec 执行外部程序

    我需要执行一个外部应用程序 该应用程序返回大量数据 需要 2 个多小时才能完成 并且连续输出数据 我需要做的是异步执行该程序并将输出捕获到文件中 我尝试使用 java process builder 但是它似乎仅在程序退出或强制终止时才挂起
  • 使用 JSF 验证更改 CSS 样式

    我正在研究在 JSF 服务器端验证后以红色突出显示失败的字段的要求 无法使用 javascript 进行验证 有没有一种方法可以将服务器端验证与 css 样式更改链接起来 您可以使用托管 bean 来执行此操作 public class V
  • Laravel Backpack - 显示关系函数中的特定属性

    我已经注册了Comment模型有一个User参考 像这样 public function user return this gt belongsTo App User 该函数返回一个实例User 这是正确的 但我不知道如何注册User列获取
  • jquery 捕获单词值

    有没有办法用 jquery 或 javascript 捕获单词值 在示例中 搜索 五月行情 当我单击 搜索 或 引号 或任何单词时 我会提醒该单词文本吗 Update 这就是我的意思 http jsfiddle net BE68L http
  • 动态代码生成

    我目前正在开发一个应用程序 您可以用它创建 程序 而无需编写源代码 如果您愿意 只需单击并播放即可 现在的问题是如何从我的数据模型生成可执行程序 有很多种可能性 但我不确定哪一种最适合我 我需要生成包含类和命名空间以及可以成为应用程序一部分
  • 谷歌应用程序脚本桌面IDE [重复]

    这个问题在这里已经有答案了 我喜欢将 Google Sheets 与应用程序脚本一起使用 但在线脚本 IDE 很麻烦 滞后 等 并且没有桌面 IDE 的许多便利 希望谷歌能在某个时候推出桌面IDE 有人知道制作 Google 应用程序脚本的
  • 传单中的javascript地图如何刷新

    我通过使用传单 API 在 javascript 中有一个基本的 geoJson 程序 div style width 100 height 400px div
  • 在 Laravel 8 中捕获 HTTP 客户端错误

    你如何捕捉抛出的错误HTTP客户端 https laravel com docs 8 x http client 例如超时 以便在您可以对错误执行任何操作以避免停止执行之前 它不会在 Laraval 调试器 在调试模式下 中抛出curl 错
  • 表视图中的文本标签太长,会影响正确的详细信息(detailTextLabel)被覆盖或不显示

    我已经为该单元格设置了一个文本 但是 它显示的文本太长 这会影响正确的详细文本被覆盖或不显示 我无法更改它 因为我需要下一个视图控制器中的名称 是否可以使其仅显示文本 后跟 EXAMPLE 电气电子工程 01 gt 传奇 Electrica
  • 如何在插件架构中做到免注册COM

    我们使用清单文件来实现免注册 COM 正如我在这另一个问题 https stackoverflow com questions 465882 generate manifest files for registration free com
  • 在哪里添加 String 原型

    我目前正在 Titanium Studio 中使用 JavaScript CommonJS 并且有一个关于原型设计的问题 假设我想向现有的类添加一个新函数 例如 String prototype trim function return t
  • 运行应用程序中的 Grails 3.0 静态 html

    之前曾就 grails 2 3 4 提出过类似的问题 我觉得很奇怪 我找不到一种方法来做到这一点 因为这对我来说似乎是一个标准用例 我只是想在运行 grails run app 时提供 html 页面 包括它们链接的 css 和 js An
  • 使用 asyncio 并行化生成器

    我的应用程序从慢速 I O 源读取数据 进行一些处理 然后将其写入本地文件 我已经用生成器实现了这个 如下所示 import time def io task x print requesting data for input s x ti
  • 您能否返回适用于任何可能的错误类型的结果?

    我想使用多个库 每个库都有自己的错误类型 我并不真正关心每个特定板条箱的错误类型 我想使用 习惯用法是使用那些返回 a 的 crate 的方法Result type 我也不想解开这些值 如果遇到错误 这会导致恐慌 我可能只是想使用传播不同的