簡介
Exception是程序中的異常情況,在JAVA中exception有checked Exception和unchecked Exception。那么在dart中的情況是不是一樣的呢?一起來看看吧。
Exception和Error
Dart中表示異常的類有兩個,分別是Exception和Error。他們兩個有什么區別呢?
Exception是由VM或者dart code中拋出的。
Exception主要用來表示用戶程序編寫過程中產生的異常,是可以定位到的可以解決的異常。通常來說Exception中包含了足夠的信息來方便用戶來定位異常點。
所以Exception通常是需要被catch的。但是和java不同的是,dart中所有的異常都是unchecked 異常,也就是說dart中的異常並不強制要求被捕獲,是否捕獲異常是由程序員自行決定的。
構造一個異常很簡單,如下所示:
Exception("message")
但是dart並不推薦這樣使用,因為這樣構造的異常太過通用了,即使捕獲到這樣的異常,可以獲得信息也比較少。所以dart推薦拋出自定義異常,也就是說根據業務需要去創建Exception對應的類,然后根據業務需要進行拋出。
dart中也有很多Exception的子類,比如FormatException來表示各種不同的異常情形。
同樣的,在JAVA中也是這樣推薦的,不要直接拋出Exception,而是根據業務需要拋出自定義的異常。
和JAVA一樣,dart中的Error表示的是一個嚴重的錯誤,Error是應該在程序編寫過程中需要避免的。
dart中的Error並不需要被捕獲,因為發生了Error就表示程序出現了非常嚴重的錯誤,已經無法運行下去了。
所以Error是我們在程序編寫過程中需要避免的。
Throw和catch
如果程序產生了異常,則可以使用Throw語句將其拋出,然后在合適的地方使用catch進行捕獲。
比如我們throw一個格式異常:
throw FormatException('這是一個格式異常');
但是在dart中,不僅僅可以throw Exception或者Error,任何一個Object都可以throw出去,如下所示:
throw "這是一個異常!";
拋出的異常可以使用catch來捕獲:
try{
do something
}catch(e){
}
dart也可以捕獲特定的異常,這種情況用on語句來表示,如下:
try {
someException();
} on OutOfIndexException {
// 捕獲特定的異常
doSomething();
} on Exception catch (e) {
// 捕獲其他的Exception
print('其他的異常: $e');
} catch (e) {
// 處理剩下的異常
print('剩下的異常: $e');
}
dart中的catch可以指定兩個參數,第一個參數就是throw的異常,第二個參數是StackTrace對象:
try {
} catch (e, s) {
print('異常信息: $e');
print('堆棧信息: $s');
}
在處理完異常之后,如果想要再將其拋出,可以使用rethrow:
void doSomething(){
try{
}catch (e) {
print('get exception');
rethrow; // rethrow這個異常
}
}
Finally
和JAVA一樣,dart中也有Finally,用來進行最終的處理。Finally會在所有的catch語句執行完畢之后執行:
try {
doSomething();
} catch (e) {
print('Error: $e');
} finally {
cleanUpJob(); // 最后的清理工作
}
總結
以上就是dart中的異常和對異常的處理。
本文已收錄於 http://www.flydean.com/05-dart-exception/
最通俗的解讀,最深刻的干貨,最簡潔的教程,眾多你不知道的小技巧等你來發現!
歡迎關注我的公眾號:「程序那些事」,懂技術,更懂你!
