gpt4 book ai didi

error-handling - 如何返回带有一般错误的结果

转载 作者:行者123 更新时间:2023-12-03 11:42:23 29 4
gpt4 key购买 nike

我想编写一个读取文件内容的函数,如果失败,则会引发错误。我想从python脚本调用此函数,因此在下面可能涉及到Python时,我会在其中提及一些内容。
正如我尝试在注释中显示的那样,可能会发生更多引发其他类型错误的工作,因此,如果可能,我希望在Rust(?)中使用通用错误。我如何返回错误,以便可以处理它并包装在python错误中,如do_work所示?不知道导致以下错误的方法是否正确。

fn work_with_text() -> Result<(), dyn std::error::Error> {
let content = match std::fs::read_to_string("text.txt") {
Ok(t) => t,
Err(e) => return Err(e),
};
// do something with content that may cause another type of error (rusqlite error)
Ok(())
}


#[pyfunction]
fn do_work(_py: Python) -> PyResult<u32> {
match work_with_text() {
Ok(_) => (0),
Err(e) => {
let gil = Python::acquire_gil();
let py = gil.python();
let error_message = format!("Error happened {}", e.to_string());
PyIOError::new_err(error_message).restore(py);
return Err(PyErr::fetch(py));
}
};

// ...
}
错误:
1   | ...                   fn work_with_text() -> Result<(), dyn std::error::Error> {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time
|
= help: the trait `Sized` is not implemented for `(dyn std::error::Error + 'static)`

最佳答案

您当前的版本不起作用,因为特征对象没有静态已知的大小,这意味着编译器不知道要在堆栈上为其分配多少空间,因此您不能将未定大小的类型用作函数参数或返回除非您通过将它们放在指针后面来调整它们的大小。
固定示例:

fn work_with_text() -> Result<(), Box<dyn std::error::Error>> {
let content = std::fs::read_to_string("text.txt")?;
// do something with content that may cause another type of error (rusqlite error)
Ok(())
}
拥有 Box<dyn std::error::Error>还可以让您从函数中返回各种错误,因为大多数错误类型都可以通过 Box<dyn std::error::Error>运算符自动转换为 ?
如果您想对Rust中的大小和错误处理有更深入的了解,我强烈建议您阅读 Sizedness in RustError Handling in Rust

关于error-handling - 如何返回带有一般错误的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65845532/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com