| // 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. |
| // VMOptions=--optimization-counter-threshold=10 |
| |
| import "package:expect/expect.dart"; |
| |
| class MyException {} |
| |
| class MyException1 extends MyException {} |
| |
| class MyException2 extends MyException {} |
| |
| class TryCatchTest { |
| static void test1() { |
| var foo = 0; |
| try { |
| throw new MyException1(); |
| } on MyException2 catch (e) { |
| foo = 1; |
| } on MyException1 catch (e) { |
| foo = 2; |
| } on MyException catch (e) { |
| foo = 3; |
| } |
| Expect.equals(2, foo); |
| } |
| |
| static void test2() { |
| var foo = 0; |
| try { |
| throw new MyException1(); |
| } on MyException2 catch (e) { |
| foo = 1; |
| } on MyException catch (e) { |
| foo = 2; |
| } on MyException1 catch (e) { |
| foo = 3; |
| } |
| Expect.equals(2, foo); |
| } |
| |
| static void test3() { |
| var foo = 0; |
| try { |
| throw new MyException(); |
| } on MyException2 catch (e) { |
| foo = 1; |
| } on MyException1 catch (e) { |
| foo = 2; |
| } on MyException catch (e) { |
| foo = 3; |
| } |
| Expect.equals(3, foo); |
| } |
| |
| static void test4() { |
| var foo = 0; |
| try { |
| try { |
| throw new MyException(); |
| } on MyException2 catch (e) { |
| foo = 1; |
| } on MyException1 catch (e) { |
| foo = 2; |
| } |
| } on MyException catch (e) { |
| Expect.equals(0, foo); |
| foo = 3; |
| } |
| Expect.equals(3, foo); |
| } |
| |
| static void test5() { |
| var foo = 0; |
| try { |
| throw new MyException1(); |
| } on MyException2 catch (e) { |
| foo = 1; |
| } catch (e) { |
| foo = 2; |
| } |
| Expect.equals(2, foo); |
| } |
| |
| static void test6() { |
| var foo = 0; |
| try { |
| throw new MyException(); |
| } on MyException2 catch (e) { |
| foo = 1; |
| } on MyException1 catch (e) { |
| foo = 2; |
| } catch (e) { |
| foo = 3; |
| } |
| Expect.equals(3, foo); |
| } |
| |
| static void test7() { |
| var foo = 0; |
| try { |
| try { |
| throw new MyException(); |
| } on MyException2 catch (e) { |
| foo = 1; |
| } on MyException1 catch (e) { |
| foo = 2; |
| } |
| } catch (e) { |
| Expect.equals(0, foo); |
| foo = 3; |
| } |
| Expect.equals(3, foo); |
| } |
| |
| static void test8() { |
| var e = 3; |
| var caught = false; |
| try { |
| throw new MyException(); |
| } catch (exc) { |
| caught = true; |
| } |
| Expect.equals(true, caught); |
| Expect.equals(3, e); |
| } |
| |
| static void test9() { |
| dynamic e = 6; |
| try { |
| throw "up"; |
| } on String { |
| e = "s"; |
| } on int { |
| e = "i"; |
| } |
| Expect.equals("s", e); |
| } |
| |
| static void test10() { |
| try { |
| throw "up"; |
| } on String catch (e) { |
| var e = 1; // ok, shadows exception variable. |
| Expect.equals(1, e); |
| } |
| } |
| |
| static void test11() { |
| var e0 = 11; |
| try { |
| throw "up"; |
| } on int catch (e0) { |
| Expect.fail("unreachable"); |
| } on String catch (e1) { |
| // e0 from the other catch clause is not in scope. |
| Expect.equals(11, e0); |
| } |
| } |
| |
| static void test12() { |
| const x = const []; |
| try { |
| throw "up"; |
| } catch (e) { |
| Expect.equals("up", e); |
| } on String catch (e) { |
| // Compile-time constants in unreachable catch blocks are still |
| // compiled. |
| const y = x[0]; |
| // ^^^^ |
| // [analyzer] COMPILE_TIME_ERROR.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE |
| // ^ |
| // [cfe] Constant evaluation error: |
| Expect.fail("unreachable"); |
| } |
| } |
| |
| static void testMain() { |
| test1(); |
| test2(); |
| test3(); |
| test4(); |
| test5(); |
| test6(); |
| test7(); |
| test8(); |
| test9(); |
| test10(); |
| test11(); |
| test12(); |
| } |
| } |
| |
| main() { |
| for (var i = 0; i < 20; i++) { |
| TryCatchTest.testMain(); |
| } |
| } |