flutter【6】dart語言--異常
異常
- 和java不同,dart中的異常都是非檢查異常,方法可以不宣告可能丟擲的異常,也不要求捕獲任何異常。
- dart 提供了 Exception 和 Error 型別以及一些子型別來定義異常。不過,還可以自定義異常,只要丟擲非空物件作為異常即可,不要求必須是 Exception 和 Error 物件,一般來說都是丟擲 Exception 和 Error 型別。
Throw
//丟擲內建型別異常 FormatException throw FormatException('Expected at least 1 section'); //丟擲任意類作為異常 throw 'Out of llamas!';
throw 語句是一個表示式,如果方法體只有throw語句時,可以使用箭頭語法。
void distanceTo(Point other) => throw UnimplementedError();
Catch
異常捕獲用來終止異常的傳遞(rethrow除外)並對其進行處理。
try { breedMoreLlamas(); } on OutOfLlamasException { buyMoreLlamas(); }
如果需要處理多種型別的異常,可以定義多個catch語句,每個語句分別對應一個異常型別,如果捕獲語句沒有指定異常型別,可以捕獲任何異常型別。
try { breedMoreLlamas(); } on OutOfLlamasException { // A specific exception buyMoreLlamas(); } on Exception catch (e) { // Anything else that is an exception print('Unknown exception: $e'); } catch (e) { // No specified type, handles all print('Something really unknown: $e'); }
從上面程式碼裡可以看出,捕獲語句可以用 on 或者 catch 來宣告,也可以同時使用,使用 on 指定異常型別,使用 catch 接收異常物件。
catch() 語句可以指定一個或者兩個引數,第一個引數就是丟擲的異常,第二個是 StackTrace 物件。
try { // ··· } on Exception catch (e) { print('Exception details:\n $e'); } catch (e, s) { print('Exception details:\n $e'); print('Stack trace:\n $s'); }
如果需要處理一部分異常,而且讓異常繼續傳遞,則可以使用 rethrow 關鍵字。
void misbehave() { try { dynamic foo = true; print(foo++); // Runtime error } catch (e) { print('misbehave() partially handled ${e.runtimeType}.'); rethrow; // Allow callers to see the exception. } } void main() { try { misbehave(); } catch (e) { print('main() finished handling ${e.runtimeType}.'); } }
finally
finally 語句是為了保證某些程式碼無論異常是否丟擲都能夠執行。如果沒有catch 語句能夠匹配所丟擲的異常, finally 語句中的程式碼執行完畢後,異常再丟擲。
finally 語句位於其他 catch 語句之後。
try { breedMoreLlamas(); } finally { // Always clean up, even if an exception is thrown. cleanLlamaStalls(); } try { breedMoreLlamas(); } catch (e) { print('Error: $e'); // Handle the exception first. } finally { cleanLlamaStalls(); // Then clean up. }