| // Copyright (c) 2024, 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. | 
 |  | 
 | testTryCatch1() { | 
 |   try { | 
 |     print('danger!'); | 
 |   } catch (e) { | 
 |     print('caught $e'); | 
 |   } | 
 | } | 
 |  | 
 | testTryCatch2() { | 
 |   try { | 
 |     print('danger!'); | 
 |   } on TypeError { | 
 |     print('caught type error'); | 
 |   } on AssertionError catch (e) { | 
 |     print('caught assertion error $e'); | 
 |   } on Error catch (e, st) { | 
 |     print('caught error $e $st'); | 
 |   } catch (e, st) { | 
 |     print('caught something $e $st'); | 
 |   } | 
 | } | 
 |  | 
 | testTryCatch3() { | 
 |   int x = 1; | 
 |   try { | 
 |     int y = 2; | 
 |     void foo() { | 
 |       try { | 
 |         print('danger foo'); | 
 |       } catch (e) { | 
 |         print(x); | 
 |         y = 3; | 
 |       } | 
 |     } | 
 |  | 
 |     foo(); | 
 |     print(y); | 
 |   } catch (e, st) { | 
 |     print('caught $e $st'); | 
 |  | 
 |     void bar() { | 
 |       try { | 
 |         print('danger bar'); | 
 |       } on Error catch (e) { | 
 |         print('error $e, captured stack trace: $st'); | 
 |       } | 
 |     } | 
 |  | 
 |     return bar; | 
 |   } | 
 | } | 
 |  | 
 | testRethrow(bool cond) { | 
 |   try { | 
 |     try { | 
 |       print('try 1 > try 2'); | 
 |     } catch (e) { | 
 |       try { | 
 |         print('try 1 > catch 2 > try 3'); | 
 |         if (cond) { | 
 |           rethrow; | 
 |         } | 
 |       } catch (e) { | 
 |         print('try 1 > catch 2 > catch 3'); | 
 |       } | 
 |     } | 
 |   } catch (e, st) { | 
 |     print('catch 1'); | 
 |     print(st); | 
 |   } | 
 | } | 
 |  | 
 | testTryFinally1() { | 
 |   for (int i = 0; i < 10; i++) { | 
 |     try { | 
 |       if (i > 5) { | 
 |         break; | 
 |       } | 
 |     } finally { | 
 |       print(i); | 
 |     } | 
 |   } | 
 | } | 
 |  | 
 | testTryFinally2(int x) { | 
 |   switch (x) { | 
 |     case 1: | 
 |       try { | 
 |         print('before try 1'); | 
 |         int y = 3; | 
 |         try { | 
 |           print('try'); | 
 |           void foo() { | 
 |             print(x); | 
 |             print(y); | 
 |           } | 
 |  | 
 |           foo(); | 
 |           continue L; | 
 |         } finally { | 
 |           print('finally 1'); | 
 |         } | 
 |         // ignore: dead_code | 
 |         print('after try 1'); | 
 |       } finally { | 
 |         print('finally 2'); | 
 |       } | 
 |       // ignore: dead_code | 
 |       break; | 
 |     L: | 
 |     case 2: | 
 |       print('case 2'); | 
 |       break; | 
 |   } | 
 | } | 
 |  | 
 | testTryFinally3() { | 
 |   int x = 11; | 
 |   dynamic y; | 
 |   try { | 
 |     y = () { | 
 |       print(x); | 
 |       try { | 
 |         print('try 1'); | 
 |         return 42; | 
 |       } finally { | 
 |         try { | 
 |           print('try 2'); | 
 |           return 43; | 
 |         } finally { | 
 |           print(x); | 
 |         } | 
 |       } | 
 |     }; | 
 |   } finally { | 
 |     print(x); | 
 |     y(); | 
 |   } | 
 | } | 
 |  | 
 | testTryCatchFinally() { | 
 |   try { | 
 |     print('try'); | 
 |   } catch (e) { | 
 |     print('catch'); | 
 |   } finally { | 
 |     print('finally'); | 
 |   } | 
 | } | 
 |  | 
 | main() {} |