Tauri Rust錯誤處理

2024-01-26 09:59 更新

如果處理程序可能失敗,需要返回一個錯誤,請函數(shù)返回一個 :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))

如上所述,從命令返回的所有內(nèi)容都必須實現(xiàn) serde::Serialize,包括錯誤。如果您正在處理 Rust 的 std 庫或外部 crate 中的錯誤類型,這可能會有問題,因為大多數(shù)錯誤類型都沒有實現(xiàn)它。在簡單方案中,您可以使用這些錯誤轉(zhuǎn)換為 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(())
}

由于這不是很慣用,因此您可能希望創(chuàng)建自己的錯誤類型來實現(xiàn) .在以下示例中,我們使用 thiserror crate 來幫助創(chuàng)建錯誤類型。它允許您通過派生特征將枚舉轉(zhuǎn)換為錯誤類型。您可以查閱其文檔了解更多詳細信息。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(())
}

自定義錯誤類型的優(yōu)點是明確所有可能的錯誤,以便讀者可以快速識別可能發(fā)生的錯誤。這為其他人(和你自己)節(jié)省了大量時間,以便以后查看和重構(gòu)代碼。
它還使您可以完全控制錯誤類型的序列化方式。在上面的示例中,我們只是將錯誤消息作為字符串返回,但您可以為每個錯誤分配一個類似于 C 的代碼,這樣您可以更輕松地將其映射到外觀相似的 TypeScript 錯誤枚舉。


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號