blob: 5d6e66061cf3ad50ea910eab5ea0c554c3917087 [file] [log] [blame]
// Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
/// @assertion Execution of a try statement of the form try s1 on−catch1 ...
/// on−catchn finally sf; proceeds as follows:
/// The statement s1 is executed in the dynamic scope of the exception handler
/// defined by the try statement. Then, the finally clause is executed.
/// Whether any of the on-catch clauses is executed depends on whether a
/// matching exception has been raised by s1 (see the specification of the throw
/// statement).
/// If s1 has raised an exception, it will transfer control to the try statements
/// handler, which will examine the catch clauses in order for a match as
/// specified above. If no matches are found, the handler will execute the
/// finally clause.
/// If a matching on-catch was found, it will execute first, and then the
/// finally clause will be executed.
/// @description Checks the execution order of the various parts of a try
/// statement.
/// @author kaigorodov
import '../../../Utils/expect.dart';
class E0 implements Exception {}
class E1 implements Exception {}
class E2 extends E1 {}
class E3 extends E1 {}
void test(void f(), int expected) {
int log = 0;
void append(int digit) {log = log * 10 + digit;}
try {
append(1);
f();
append(2);
} on E2 catch (e) {
append(3);
} on E1 catch (e) {
append(4);
} catch (e) {
append(5);
} finally {
append(6);
}
Expect.equals(expected, log);
}
void main() {
test(() {}, 126);
test(() {throw new E0();}, 156);
test(() {throw new E1();}, 146);
test(() {throw new E2();}, 136);
test(() {throw new E3();}, 146);
test(() {throw 1;}, 156);
}