2015-03-31 61 views
2
import 'dart:async'; 

void main() { 
    divide(1, 0).then((result) => print('1/0 = $result')) 
    .catchError((error) => print('Error occured during division: $error')); 
} 

Future<double> divide(int a, b) { 
    if (b == 0) { 
    throw new Exception('Division by zero'); 
    } 
    return new Future.value(a/b); 
} 

目前我正在學習如何使用Dart中的期貨,並且我陷入了這樣一個簡單的例子。當用戶嘗試執行零除法時,我的將來會拋出異常。但是,.catchError不處理我的異常。取而代之,我用堆棧跟蹤得到了未處理的異常。我很確定我錯過了一些明顯的東西,但不明白究竟是什麼。未來的執行會導致未處理的異常

據我所知,還有另一種方式來處理錯誤:

divide(1, 0).then((result) => print('1/0 = $result'), 
    onError: (error) => print('Error occured during division: $error')); 

使用命名可選的參數 - onerror的。這樣做仍會導致未處理的異常。

我想澄清一件事。我對嗎? - 這兩種方法之間的唯一區別是.catchError()還可以處理內部期貨(外部未來的then()方法內部調用的期貨)引發的錯誤,而onError只捕獲外部未來引發的錯誤?

德米特里

謝謝。

回答

3

您的錯誤處理無法正常工作,因爲錯誤在您的代碼的同步部分中拋出。僅僅因爲該方法返回未來並不意味着此方法中的所有內容都是異步的。

void main() { 
    try { 
    divide(1, 0) 
     .then((result) => print('1/0 = $result')); 
    } catch (error) { 
    print('Error occured during division: $error'); 
    } 
} 

如果您改變divide功能像

Future<double> divide(int a, b) { 
    return new Future(() { 
    if (b == 0) { 
     throw new Exception('Division by zero'); 
    } 
    return new Future.value(a/b); 
    }); 
} 

你會得到一個異步錯誤,您的異步錯誤處理工作。

更簡單的方法是使用新的異步/等待在DartPad

main() async { 
    try { 
    await divide(1, 0); 
    } catch(error){ 
    print('Error occured during division: $error'); 
    } 
} 

嘗試和另一優點是這部作品在這兩種情況下。

+0

謝謝你的回答。我是否正確理解,等待/異步是在1.9版本(最新版本)中引入的,它是期貨的替代品嗎?無論如何,我想了解我的例子有什麼問題。 – 2015-03-31 21:23:19

+0

我錯過了一些東西,並更新了我的答案。異步/等待不是期貨,它只是讓你更容易地使用未來。請參閱https://www.dartlang.org/articles/await-async/或http://stackoverflow.com/questions/27212220 – 2015-03-31 21:26:30

+0

哦,對!現在我懂了。還有一個簡短的問題。如果我在你的例子中使用了修改後的除法函數,我可以返回** a/b **而不是** new Future.value(a/b)**嗎?也感謝您提供的鏈接。 – 2015-03-31 21:33:11