2016-12-09 1 views
3

Ich habe Code ähnlich:Wie kann man Fehler erkennen, die bei Timer-Funktionsaufrufen ausgelöst werden?

timer = new Timer(new Duration(milliseconds: 1000),() => (throw new TimeoutException('Callback not invoked!'))); 

    while (timer.isActive){ 
    await new Future.delayed(const Duration(milliseconds: 1),() => "1"); 
    } 
    print('this should not be reached if the exception is raised'); 

an anderer Stelle ich einen Asynchron-Rückruf haben, die Anrufe:

timer.cancel(); 

In dem Fall, dass der Rückruf es funktioniert aufgerufen wird, da der Rückruf den Timer annulliert.

Allerdings bin ich nicht wirklich sicher, wie man die TimeoutException in diesem Fall tatsächlich fängt, wenn es nicht abgebrochen wird, weil es scheint, dass die Ausnahme in einem anderen Bereich als meine Hauptfunktion ausgelöst wird. Dies bedeutet, dass die Programmausführung fortgesetzt wird, obwohl

Gibt es eine Möglichkeit, eine Art try/catch zu machen oder irgendwie die obige Timeout-Ausnahme zu behandeln? Oder ein besserer Weg zu tun, was ich versuche zu tun?

Verwenden von Dart 1.19.1.

+0

Sind Sie sicher, dass Sie das 'Timer' brauchen? Was ist mit der Verwendung von 'Future.delayed(). Timeout ...'? –

+0

@ GünterZöchbauer Wenn das eine bessere Option ist, bin ich mehr als bereit, sie zu benutzen. Ich habe ursprünglich den Timer verwendet, weil ich tatsächlich verfolgen kann, wie lange der gesamte Rückruf dauert, aber nicht in der Lage war, das mit einer zukünftigen Operation zu arbeiten. – enderland

Antwort

0

Sie unterschiedliches Verhalten, je nachdem, ob das Timeout 500ms oder 1500ms:

final timer = new Future.delayed(const Duration(milliseconds: 1000), 
     () => (throw new Exception('Callback not invoked!'))) 
    .timeout(const Duration(milliseconds: 500)); 
    try { 
    await timer; 
    } on TimeoutException catch(e) { 
    print('this should not be reached if the exception is raised'); 
    } on Exception catch(e) { 
    print('exception: $e'); 
    } 

DartPad

+0

Wie kann ich den Timer-Termin in meinem anderen Rückruf stornieren? Zuvor konnte ich nur 'timer.cancel()' was funktioniert haben, aber mir ist nicht klar, wie man die Zukunft hier vor dem Timeout von einem anderen Callback lösen soll? – enderland

+0

Ich verstehe. Daran habe ich nicht gedacht. Ich glaube nicht, dass es eine Möglichkeit gibt, eine "Zukunft" abzusagen. Siehe auch http://stackoverflow.com/questions/17552757/is-there-any-way-to-cancel-a-dart-future, https://github.com/dart-lang/sdk/issues/1806 –

Verwandte Themen