Tauri Rust错误处理
2024-01-26 09:59 更新
如果处理程序可能失败,需要返回一个错误,请函数返回一个 :Result
#[tauri::command]
fn my_custom_command() -> Result<String, String> {
// If something fails
Err("This failed!".into())
// If it worked
Ok("This worked!".into())
}
如果命令返回错误,promise 将拒绝,否则解析为:
invoke('my_custom_command')
.then((message) => console.log(message))
.catch((error) => console.error(error))
如上所述,从命令返回的所有内容都必须实现 serde::Serialize
,包括错误。如果您正在处理 Rust 的 std 库或外部 crate 中的错误类型,这可能会有问题,因为大多数错误类型都没有实现它。在简单方案中,您可以使用这些错误转换为 s:map_err
String
#[tauri::command]
fn my_custom_command() -> Result<(), String> {
// This will return an error
std::fs::File::open("path/that/does/not/exist").map_err(|err| err.to_string())?;
// Return nothing on success
Ok(())
}
由于这不是很惯用,因此您可能希望创建自己的错误类型来实现 .在以下示例中,我们使用 thiserror
crate 来帮助创建错误类型。它允许您通过派生特征将枚举转换为错误类型。您可以查阅其文档了解更多详细信息。serde::Serialize
thiserror::Error
// create the error type that represents all errors possible in our program
#[derive(Debug, thiserror::Error)]
enum Error {
#[error(transparent)]
Io(#[from] std::io::Error)
}
// we must manually implement serde::Serialize
impl serde::Serialize for Error {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: serde::ser::Serializer,
{
serializer.serialize_str(self.to_string().as_ref())
}
}
#[tauri::command]
fn my_custom_command() -> Result<(), Error> {
// This will return an error
std::fs::File::open("path/that/does/not/exist")?;
// Return nothing on success
Ok(())
}
自定义错误类型的优点是明确所有可能的错误,以便读者可以快速识别可能发生的错误。这为其他人(和你自己)节省了大量时间,以便以后查看和重构代码。
它还使您可以完全控制错误类型的序列化方式。在上面的示例中,我们只是将错误消息作为字符串返回,但您可以为每个错误分配一个类似于 C 的代码,这样您可以更轻松地将其映射到外观相似的 TypeScript 错误枚举。
以上内容是否对您有帮助:
更多建议: