我下面有一个简单的程序,它试图打印String
从硬编码Vec
通过创建的String::from_utf8
。
我还在这里使用类型别名来减少冗长(例如Result<String, SomeError>
vs Result<String>
)
use std::error;
use std::result;
pub type Error = Box<dyn error::Error>;
pub type Result<T> = result::Result<T, Error>;
fn main() {
let vec = vec![65; 3];
let text = String::from_utf8(vec).unwrap();
println!("result {}", text);
}
fn foo() -> Result<String> {
let vec = vec![65; 3];
String::from_utf8(vec)
}
Run Code Online (Sandbox Code Playgroud)
但是该程序无法编译,我收到此错误:
|
26 | fn foo() -> Result<String> {
| -------------- expected `std::result::Result<String, Box<(dyn std::error::Error + 'static)>>` because of return type
27 | let vec = vec![65; 3];
28 | String::from_utf8(vec)
| ^^^^^^^^^^^^^^^^^^^^^^ expected struct `Box`, found struct `FromUtf8Error`
|
= note: expected enum `std::result::Result<_, Box<(dyn std::error::Error + 'static)>>`
found enum `std::result::Result<_, FromUtf8Error>`
Run Code Online (Sandbox Code Playgroud)
我想知道是否有人对为什么这不起作用有任何见解。我本希望Box<dyn error::Error>
捕获所有错误,但它看起来像是FromUtf8Error
一个例外(或者也许我只是误解了某些内容)。有没有办法调整自定义Result
别名以进行一般捕获FromUtf8Error
?
在一种情况下你有FromUtf8Error
,在另一种情况下你有Box<Stuff>
。Stuff
完全无关,Rust 从来不会隐式地转换或装箱任何东西。如果要转换错误,请使用?
运算符。该运算符尝试转换错误类型,并且可以进行错误装箱:
fn foo() -> Result<String> {
let vec = vec![65; 3];
Ok(String::from_utf8(vec)?)
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
618 次 |
最近记录: |