W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
如果處理程序可能失敗,需要返回一個錯誤,請函數(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_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(())
}
由于這不是很慣用,因此您可能希望創(chuàng)建自己的錯誤類型來實現(xiàn) .在以下示例中,我們使用 thiserror
crate 來幫助創(chuàng)建錯誤類型。它允許您通過派生特征將枚舉轉(zhuǎn)換為錯誤類型。您可以查閱其文檔了解更多詳細信息。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(())
}
自定義錯誤類型的優(yōu)點是明確所有可能的錯誤,以便讀者可以快速識別可能發(fā)生的錯誤。這為其他人(和你自己)節(jié)省了大量時間,以便以后查看和重構(gòu)代碼。
它還使您可以完全控制錯誤類型的序列化方式。在上面的示例中,我們只是將錯誤消息作為字符串返回,但您可以為每個錯誤分配一個類似于 C 的代碼,這樣您可以更輕松地將其映射到外觀相似的 TypeScript 錯誤枚舉。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: