| ------------------------------------------------------------------------------- |
| -- Copyright (c) 2006-2013 Fabien Fleutot and others. |
| -- |
| -- All rights reserved. |
| -- |
| -- This program and the accompanying materials are made available |
| -- under the terms of the Eclipse Public License v1.0 which |
| -- accompanies this distribution, and is available at |
| -- http://www.eclipse.org/legal/epl-v10.html |
| -- |
| -- This program and the accompanying materials are also made available |
| -- under the terms of the MIT public license which accompanies this |
| -- distribution, and is available at http://www.lua.org/license.html |
| -- |
| -- Contributors: |
| -- Fabien Fleutot - API and implementation |
| -- |
| ------------------------------------------------------------------------------- |
| |
| -{ extension 'trycatch' } |
| |
| |
| ---------------------------------------------------------------------- |
| print "1) no error" |
| try |
| print(" Hi") |
| end |
| |
| |
| ---------------------------------------------------------------------- |
| print "2) caught error" |
| try |
| error "some_error" |
| catch x then |
| printf(" Successfully caught %q", x) |
| end |
| |
| |
| -- [[ |
| ---------------------------------------------------------------------- |
| print "3) no error, with a finally" |
| try |
| print " Hi" |
| finally |
| print " Finally OK" |
| end |
| |
| |
| ---------------------------------------------------------------------- |
| print "4) error, with a finally" |
| try |
| print " Hi" |
| error "bang" |
| catch "bang"/{_} then |
| print " Bang caught" |
| finally |
| print " Finally OK" |
| end |
| |
| |
| ---------------------------------------------------------------------- |
| print "5) nested catchers" |
| try |
| try |
| error "some_error" |
| catch "some_other_error" then |
| assert (false, "mismatch, this must not happen") |
| end |
| catch "some_error"/{x} then |
| printf(" Successfully caught %q across a try that didn't catch", x) |
| catch x then |
| assert (false, "We shouldn't reach this catch-all") |
| end |
| |
| |
| ---------------------------------------------------------------------- |
| print "6) nested catchers, with a 'finally in the inner one" |
| try |
| try |
| error "some_error" |
| catch "some_other_error" then |
| assert (false, "mismatch, this must not happen") |
| finally |
| print " Leaving the inner try-catch" |
| end |
| catch "some_error"/{x} then |
| printf(" Successfully caught %q across a try that didn't catch", x) |
| catch x then |
| assert (false, "We shouldn't reach this catch-all") |
| end |
| |
| |
| ---------------------------------------------------------------------- |
| print "7) 'finally' intercepts a return from a function" |
| function f() |
| try |
| print " into f:" |
| return "F_RESULT" |
| assert (false, "I'll never go there") |
| catch _ then |
| assert (false, "No exception should be thrown") |
| finally |
| print " I do the finally before leaving f()" |
| end |
| end |
| local fr = f() |
| printf(" f returned %q", fr) |
| |
| |
| ---------------------------------------------------------------------- |
| print "8) don't be fooled by nested functions" |
| function f() |
| try |
| local function g() return "from g" end |
| printf(" g() returns %q", g()) |
| return "from f" |
| catch _ then |
| assert (false, "No exception should be thrown") |
| end |
| end |
| local fr = f() |
| printf(" f returned %q", fr) |
| |
| ---------------------------------------------------------------------- |
| print "*) done." |
| |