codecamp

Tauri Rust错误处理

如果处理程序可能失败,需要返回一个错误,请函数返回一个 :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 错误枚举。


Tauri Rust返回数据
Tauri Rust异步命令
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

Tauri 指南

Tauri 特性

Tauri 插件

Tauri 应用程序接口

Tauri JavaScript/TypeScript

Tauri 命令行界面

Tauri 进程

Tauri 参考

Tauri WebView 版本

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }