要不是使用「?」,rust的錯誤處理會顯得有些不夠靈巧。要使用「?」我們需要宣告返回值型別為result型別,這種型別可以包含任何具備std::error::error
特徵從而可以轉換為bax
型別的錯誤型別。
拿我們需要處理io錯誤和字串轉換為數字錯誤舉例:
use std::fs::file;
use std::io::prelude::*;
use std::error::error;
fn run(file: &str) -> result>
這裡使用了倆個"?"處理可能發生的io錯誤:開啟檔案錯誤和讀取內容為string錯誤。
使用了乙個「?」處理可能發生的型別轉換錯誤。
最後我們將結果包裝為ok
型別。rust可以中返回值中判斷出parse
的結果為i32
型別。
簡化result
型別的宣告比較容易,我們可以定義乙個自己的result型別,比如:
type boxresult= result>
但是,我們程式還需要自定義error
型別,那我們就需要做些其他工作:
就像這樣:
use std::error::error;
use std::fmt;
#[derive(debug)]
struct myerror
impl myerror
}}impl fnt::display for myerror ", self.details)
}}impls error for myerror
}//乙個測試我們自定義錯誤的函式
fn raises_my_error(yes: bool) -> result<(), myerror> else
}
輸入result
比較麻煩,所以很多模組都定義了自己的result型別,這樣可以少敲幾下鍵盤。比如io模組定義了io::reust
代替result
使用。
在下面的例子中演示的是怎麼處理string型別轉化為浮點數型別可能出現錯誤的情況。
現在我們知道使用"?"可以方便的把有錯誤的表示式轉換為err返回。這種轉換是通過from
特徵實現的。
你可以繼續使用這種方便的轉換,這在一些比較簡單的應用中是個不錯的選擇,接下來我們演示的場景會複雜一些。
parsefloaterror
實現了error
特徵,所以它具備description()
方法。
use std::num::parsefloaterror;
impl fromfor myerror
}fn parse_f64(s: &str, yes: bool) -> result
fn main() ", parse_f64("42", false));
println!(" ", parse_f64("42", true));
println!(" ", parse_64("?42", false));
}
執行結果會是這樣:
ok(42)err(myerror )
err(myerror )
rust學習筆記 錯誤處理
rust的錯誤分兩種 rust提供了可恢復錯誤的型別result t,e 與不可恢復錯誤時終止執行的panic!巨集。程式會在panic!巨集執行時列印出一段錯誤提示資訊,展開並清理當前的呼叫棧,然後退出程式,這種情況大部分都發生在某個錯誤被檢測到,但程式設計師卻不知道該如何處理的時候。panic的...
回顧 了解 Rust 中的錯誤處理
精彩回顧 錯誤處理是 並解決故障可能性的過程。例如,程式無法讀取檔案,繼續使用該錯誤的輸入,將導致更多的錯誤。你發現和控制故障的能力可以使程式避免其他更多的陷阱。在本課程中,你將學習使用 panic option 和 result 處理 rust 中錯誤的方法。有了這些知識,你就可以自信地識別和解決...
MySql錯誤處理 錯誤處理的例子
有幾種錯誤處理的宣告形式 如果任何錯誤 不是 not found 設定 l error 為 1 後繼續執行 declare continue handler for sqlexception set l error 1 如果發生任何錯誤 不是 not found 執行 rollback和產生一條錯誤...