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_errString

#[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::Serializethiserror::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 错误枚举。


以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号