Exceptions/Catch an exception thrown in a nested call: Difference between revisions

(Add APL)
 
(26 intermediate revisions by 13 users not shown)
Line 18:
=={{header|11l}}==
{{trans|Python}}
<langsyntaxhighlight lang="11l">T U0 {}
T U1 {}
 
F baz(i)
I i == 0
X.throw U0()
E
X.throw U1()
 
F bar(i)
Line 37:
print(‘Function foo caught exception U0’)
 
foo()</langsyntaxhighlight>
 
{{out}}
Line 46:
 
=={{header|Ada}}==
<langsyntaxhighlight lang="ada">with Ada.Text_Io; use Ada.Text_Io;
 
procedure Exceptions_From_Nested_Calls is
Line 76:
Foo;
end loop;
end Exceptions_From_Nested_Calls;</langsyntaxhighlight>
{{out}}
<pre>
Line 88:
 
=={{header|Aime}}==
<langsyntaxhighlight lang="aime">void
baz(integer i)
{
Line 128:
 
return 0;
}</langsyntaxhighlight>
{{out}}
<pre>Exception `U0' thrown
Line 149:
 
c.f. [[Exceptions#ALGOL_68|ALGOL 68 Exceptions]] for more details.
<langsyntaxhighlight lang="algol68">MODE OBJ = STRUCT(
INT value,
STRUCT(
Line 204:
FI;
 
foo</langsyntaxhighlight>
{{out}}
<pre>
Line 218:
'''par''' clause, then all parallel the threads are terminated and the
program continues in the parent thread. <!-- example needed -->
 
=={{header|Amazing Hopper}}==
<p>Hopper has a basic "try/catch" handling, and must be handled manually. Only one exception will be raised.</p>
<p>VERSION 1: </p>
<syntaxhighlight lang="c">
#include <jambo.h>
 
Main
e=0, se=""
Try
Gosub 'Foo'
Catch (e)
Get msg exception, and Move to 'se'
Printnl ("+-MAIN-FOO CALL Error: ",e, " : ", se )
Finish
End
 
Subrutines
 
Define ' Foo '
Gosub ' Bar '
Return
 
Define ' Bar '
Set '0', Gosub ' Biz '
Set '1', Gosub ' Biz '
Return
 
Define ' Biz, x '
a=0, b=0
If ( x )
Let ' b:=Sqrt(-1) '
Nan( a ) do{ Raise (1000,"\n+----Func BIZ: NaN!") }
Else
#( a=log(-1) + log(-1) )
Nan( a ) do{ Raise (1001,"\n+----Func BIZ: NaN!") }
End If
Printnl ' "a = ", a, " b = ", b '
 
Return
</syntaxhighlight>
{{out}}
<pre>
+-MAIN-FOO CALL Error: 1001 :
+----Func BIZ: NaN!
</pre>
<p>VERSION 2: </p>
<syntaxhighlight lang="c">
#include <jambo.h>
 
Main
e=0, se=""
Try
Gosub 'Foo'
Catch (e)
Get msg exception, and Move to 'se'
Printnl ("+-MAIN Error: ",e, " : ", se )
Finish
End
 
Subrutines
 
/*
This "Try" is not considered nested, then, it is necessary
to capture the error and raise the error
*/
Define ' Foo '
Try
Gosub ' Bar '
Catch (e)
Get msg exception, and Move to 'se'
Free try // absolutly nessesary in this chase!
Raise (e, Cat ("\n+--FUNC FOO: ", se) )
Finish
Return
 
Define ' Bar '
Try
Set '0', Gosub ' Biz '
Set '1', Gosub ' Biz '
Catch(e)
Get msg exception, and Move to 'se'
Free try // absolutly nessesary in this chase!
Raise (e, Cat ("\n+---FUNC BAR: ", se) )
Finish
 
Return
 
Define ' Biz, x '
a=0, b=0
If ( x )
Let ' b:=Sqrt(-1) '
Nan( a ) do{ Raise (1000,"\n+----Func BIZ: NaN!") }
Else
#( a=log(-1) + log(-1) )
Nan( a ) do{ Raise (1001,"\n+----Func BIZ: NaN!") }
End If
Printnl ' "a = ", a, " b = ", b '
 
Return
</syntaxhighlight>
{{out}}
<pre>
+-MAIN Error: 1001 :
+--FUNC FOO:
+---FUNC BAR:
+----Func BIZ: NaN!
</pre>
 
=={{header|APL}}==
{{works with|Dyalog APL}}
 
<langsyntaxhighlight APLlang="apl">:Namespace Traps
⍝ Traps (exceptions) are just numbers
⍝ 500-999 are reserved for the user
Line 242 ⟶ 352:
⎕SIGNAL U0 U1[i]
:EndNamespace</langsyntaxhighlight>
 
{{out}}
Line 260 ⟶ 370:
In [[AutoHotkey_L]], [http://l.autohotkey.net/docs/commands/Try.htm Try], [http://l.autohotkey.net/docs/commands/Catch.htm Catch], and [http://l.autohotkey.net/docs/commands/Throw.htm Throw] are available to handle exceptions.<br/>
When this program is run, the first exception (U0) is raised, and caught by the try-catch section. This causes a Message Box containing the text "An exception was raised: First Exception" to be displayed by the script. The second exception is not caught, generating a runtime error.
<langsyntaxhighlight AHKlang="ahk">global U0 := Exception("First Exception")
global U1 := Exception("Second Exception")
 
Line 283 ⟶ 393:
else if ( calls = 2 )
throw U1
}</langsyntaxhighlight>
The runtime error:
<pre>Error: Second Exception
Line 305 ⟶ 415:
The global ErrorLevel keeps track of the last error.
Here is one way to keep track of nested errors:
<syntaxhighlight lang="autohotkey">foo()
<lang AutoHotkey>foo()
Return
 
Line 334 ⟶ 444:
ErrorLevel .= "U0"
Return 1
}</langsyntaxhighlight>
 
=={{header|BBC BASIC}}==
{{works with|BBC BASIC for Windows}}
<langsyntaxhighlight lang="bbcbasic"> REM Allocate error numbers:
U0& = 123
U1& = 124
Line 364 ⟶ 474:
ENDCASE
ENDPROC
</syntaxhighlight>
</lang>
{{out}} (the second message is output by the default error handler):
<pre>Exception U0 caught in foo
Line 387 ⟶ 497:
U0 and U1 are boring for debugging purposes. Added something to help with that.
 
<langsyntaxhighlight Clang="c">#include <stdio.h>
#include <stdlib.h>
 
Line 508 ⟶ 618:
 
 
</syntaxhighlight>
</lang>
{{out}}
<pre>Foo entering bar.
Line 524 ⟶ 634:
This example will first catch U0 and print "U0 Caught" to the console when it does. The uncaught U1 exception will then cause the program to terminate and print the type of the exception, location of the error, and the stack.
 
<langsyntaxhighlight lang="csharp">using System; //Used for Exception and Console classes
class Exceptions
{
Line 555 ⟶ 665:
foo();
}
}</langsyntaxhighlight>
 
{{out}}
Line 573 ⟶ 683:
aborting the task, typically with an error message.
 
<langsyntaxhighlight lang="cpp">#include <iostream>
class U0 {};
class U1 {};
Line 600 ⟶ 710:
std::cout<< "Should never get here!\n";
return 0;
}</langsyntaxhighlight>
 
Result:
Line 610 ⟶ 720:
 
=={{header|Clojure}}==
<langsyntaxhighlight lang="clojure">(def U0 (ex-info "U0" {}))
(def U1 (ex-info "U1" {}))
 
Line 626 ⟶ 736:
 
(defn -main [& args]
(foo))</langsyntaxhighlight>
 
{{output}}
Line 646 ⟶ 756:
=={{header|Common Lisp}}==
 
<langsyntaxhighlight lang="lisp">(define-condition user-condition-1 (error) ())
(define-condition user-condition-2 (error) ())
 
Line 663 ⟶ 773:
 
(trace foo bar baz)
(foo)</langsyntaxhighlight>
 
{{out}} (the numbered lines are output from <code>trace</code>):
<langsyntaxhighlight lang="lisp"> 0: (FOO)
1: (BAR USER-CONDITION-1)
2: (BAZ USER-CONDITION-1)
foo: Caught: Condition USER-CONDITION-1 was signalled.
1: (BAR USER-CONDITION-2)
2: (BAZ USER-CONDITION-2)</langsyntaxhighlight>
 
At this point, the debugger (if any) is invoked
Line 678 ⟶ 788:
=={{header|Crystal}}==
 
<langsyntaxhighlight lang="ruby">class U0 < Exception
end
 
Line 703 ⟶ 813:
end
 
foo</langsyntaxhighlight>
 
<pre>
Line 720 ⟶ 830:
First exception will be caught and message will be displayed,
second will be caught by default exception handler.
<langsyntaxhighlight lang="d">class U0 : Exception {
this() @safe pure nothrow { super("U0 error message"); }
}
Line 750 ⟶ 860:
void main() {
foo;
}</langsyntaxhighlight>
{{out}}
<pre>test.U1(at)test.d(8): U1 error message
Line 762 ⟶ 872:
=={{header|Delphi}}==
{{Trans|D}}
<langsyntaxhighlight lang="delphi">program ExceptionsInNestedCall;
 
{$APPTYPE CONSOLE}
Line 804 ⟶ 914:
begin
Foo;
end.</langsyntaxhighlight>
 
{{out}}
Line 816 ⟶ 926:
{{Trans|D}}
First exception will be caught and message will be displayed, second will be caught by default exception handler.
<langsyntaxhighlight lang="delphi">type Exception1 = class (Exception) end;
type Exception2 = class (Exception) end;
 
Line 845 ⟶ 955:
end;
 
Foo;</langsyntaxhighlight>
Result:
<pre>Exception1 caught
Line 852 ⟶ 962:
=={{header|Dyalect}}==
 
<syntaxhighlight lang="dyalect">var bazCallCount = 0
<lang dyalect>type U0()
type U1()
var bazCallCount = 0
 
func baz() {
bazCallCount += 1
if bazCallCount == 1 {
throw U0@BazCall1()
} else if bazCallCount == 2 {
throw U1@BazCall2()
}
}
 
func bar() {
baz()
}
 
func foo() {
var calls = 2
Line 875 ⟶ 983:
bar()
} catch {
U0@BazCall1() => print("U0BazzCall1 caught.")
}
calls -= 1
}
}
}</lang>
foo()</syntaxhighlight>
 
{{out}}
 
<pre>U0BazzCall1 caught.
Error D601: BazCall2</pre>
Runtime exception Dy601: U1
Stack trace: ...</pre>
 
=={{header|EchoLisp}}==
<langsyntaxhighlight lang="lisp">
(define (foo)
(for ((i 2))
Line 910 ⟶ 1,019:
"U0 raised" catched
👓 error: U1 not catched
</syntaxhighlight>
</lang>
 
=={{header|EGL}}==
{{incorrect|EGL|calls to bar() from foo should be equivalent. Second call can't catch anything.}}
<langsyntaxhighlight EGLlang="egl">record U0 type Exception
end
 
Line 948 ⟶ 1,057:
end
end
end</langsyntaxhighlight>
 
{{out}}
Line 960 ⟶ 1,069:
 
A file called main.e:
<langsyntaxhighlight lang="eiffel">class MAIN
inherit EXCEPTIONS
 
Line 997 ⟶ 1,106:
end
end
end</langsyntaxhighlight>
 
{{out}}
Line 1,028 ⟶ 1,137:
 
=={{header|Elena}}==
ELENA 56.0x :
<langsyntaxhighlight lang="elena">import extensions;
class U0 : Exception
{
constructor new()
<= super new("U0 exception");
}
class U1 : Exception
{
constructor new()
<= super new("U1 exception");
}
singleton Exceptions
{
static int i;
bar()
<= baz();
baz()
{
if (i == 0)
{
U0.raise()
}
else
{
U1.raise()
}
}
foo()
{
for(i := 0,; i < 2,; i +:= i + 1)
{
try
{
self.bar()
}
catch(U0 e)
{
console.printLine("U0 Caught")
}
}
}
}
Line 1,081 ⟶ 1,190:
{
Exceptions.foo()
}</langsyntaxhighlight>
{{out}}
<pre>
U0 Caught
U1 exception
mytest'U1#class
Call stack:
sandbox'$private'Exceptions.baz[1]:sandbox.l(30)
system'Exception#class.new$system'LiteralValue[1]:exceptions.l(124)
sandbox'$private'Exceptions.foo[1]:sandbox.l(40)
system'Exception#class.new[0]:exceptions.l(128)
sandbox'program.function:#invoke:sandbox.l(52)
mytest'Exceptions.baz[0]:test.l(21)
system'$private'entry.function:#invoke:app.l(5)
mytest'Exceptions.bar[0]:test.l(12)
system'$private'entrySymbol#sym:app.l(23)
mytest'Exceptions.foo[0]:test.l(30)
 
mytest'program.eval[0]:test.l(45)
Aborted:ffffffff
system'#inline1AB.start[1]:win32_app.l(35)
system'startUp(1)
</pre>
 
=={{header|Elixir}}==
<langsyntaxhighlight lang="elixir">defmodule U0, do: defexception [:message]
defmodule U1, do: defexception [:message]
 
Line 1,118 ⟶ 1,226:
end
 
ExceptionsTest.foo</langsyntaxhighlight>
 
{{out}}
Line 1,133 ⟶ 1,241:
 
=={{header|Erlang}}==
<syntaxhighlight lang="erlang">
<lang Erlang>
-module( exceptions_catch ).
 
Line 1,153 ⟶ 1,261:
 
end.
</syntaxhighlight>
</lang>
{{out}}
<pre>
Line 1,166 ⟶ 1,274:
 
=={{header|Factor}}==
<langsyntaxhighlight lang="factor">USING: combinators.extras continuations eval formatting kernel ;
IN: rosetta-code.nested-exceptions
 
Line 1,186 ⟶ 1,294:
] twice ;
 
foo</langsyntaxhighlight>
{{out}}
<pre>
Line 1,210 ⟶ 1,318:
=={{header|Fantom}}==
 
<langsyntaxhighlight lang="fantom">
const class U0 : Err
{
Line 1,259 ⟶ 1,367:
}
}
</syntaxhighlight>
</lang>
 
{{out}}
Line 1,290 ⟶ 1,398:
=={{header|FreeBASIC}}==
FreeBASIC does not support exceptions or the Try/Catch/Finally statement, as such. However, you can use the Err() function, together with an If (or Switch) statement, to provide somewhat similar functionality:
<langsyntaxhighlight lang="freebasic">' FB 1.05.0 Win64
 
Enum ErrorTypes
Line 1,337 ⟶ 1,445:
Print
Print "Press any key to quit"
Sleep</langsyntaxhighlight>
 
{{out}}
Line 1,355 ⟶ 1,463:
The solution here is to define a wrapper, or proxy function, called try.
Function foo calls bar indirectly through try.
<langsyntaxhighlight lang="go">// Outline for a try/catch-like exception mechanism in Go
//
// As all Go programmers should know, the Go authors are sharply critical of
Line 1,457 ⟶ 1,565:
}
trace("complete")
}</langsyntaxhighlight>
{{out}}
<pre>
Line 1,495 ⟶ 1,603:
</pre>
A simpler example, closer to the task description:
<langsyntaxhighlight lang="go">package main
 
import "fmt"
Line 1,553 ⟶ 1,661:
foo()
fmt.Println("No panic")
}</langsyntaxhighlight>
[http://play.golang.org/p/X2pa8zE1Ce Run in Go Playground].
{{out}}
Line 1,565 ⟶ 1,673:
=={{header|Haskell}}==
 
<langsyntaxhighlight lang="haskell">import Control.Monad.Error
import Control.Monad.Trans (lift)
 
Line 1,602 ⟶ 1,710:
case result of
Left e -> putStrLn ("Caught error at top level: " ++ show e)
Right v -> putStrLn ("Return value: " ++ show v)</langsyntaxhighlight>
 
{{out}}
Line 1,623 ⟶ 1,731:
not found in languages that natively support exceptions.</i>
 
<langsyntaxhighlight Uniconlang="unicon">import Exceptions
 
class U0 : Exception()
Line 1,667 ⟶ 1,775:
initial U0().throw("First exception")
U1().throw("Second exception")
end</langsyntaxhighlight>
 
{{out}}
Line 1,686 ⟶ 1,794:
 
=={{header|Io}}==
<langsyntaxhighlight Iolang="io">U0 := Exception clone
U1 := Exception clone
 
Line 1,705 ⟶ 1,813:
)
 
foo</langsyntaxhighlight>
{{out}}
<pre>foo caught U0
Line 1,720 ⟶ 1,828:
J leaves most of the implementation of exceptions to the programmer, so:
 
<langsyntaxhighlight Jlang="j">main=: monad define
smoutput 'main'
try. foo ''
Line 1,741 ⟶ 1,849:
smoutput ' baz'
type_jthrow_=: 'U',":y throw.
)</langsyntaxhighlight>
 
'''Example use:'''
<langsyntaxhighlight lang="j"> main ''
main
foo
Line 1,752 ⟶ 1,860:
bar
baz
main caught U1</langsyntaxhighlight>
 
=={{header|Java}}==
Line 1,760 ⟶ 1,868:
(or a superclass thereof), unless they are unchecked exceptions
(subclasses of <code>RuntimeException</code> or <code>Error</code>):
<langsyntaxhighlight lang="java">class U0 extends Exception { }
class U1 extends Exception { }
 
Line 1,788 ⟶ 1,896:
foo();
}
}</langsyntaxhighlight>
{{out}}
<pre>
Line 1,815 ⟶ 1,923:
The <code>callee.name</code> property, and the <code>catch(e if ...)</code> statement are Mozilla JavaScript extensions.
 
<langsyntaxhighlight lang="javascript">function U() {}
U.prototype.toString = function(){return this.className;}
 
Line 1,849 ⟶ 1,957:
}
 
foo();</langsyntaxhighlight>
{{out}} from [[Rhino]]:
<pre>caught exception U0
Line 1,859 ⟶ 1,967:
=={{header|jq}}==
{{works with|jq|>1.4}}
<langsyntaxhighlight lang="jq"># n is assumed to be the number of times baz has been previously called:
def baz(n):
if n==0 then error("U0")
Line 1,872 ⟶ 1,980:
(try bar(1) catch if . == "U0" then "We caught U0" else error(.) end);
 
foo</langsyntaxhighlight>
{{out}}
$ jq -n -f Catch_an_exception_thrown_in_a_nested_call.jq
Line 1,881 ⟶ 1,989:
{{works with|Julia|0.6}}
 
<langsyntaxhighlight lang="julia">struct U0 <: Exception end
struct U1 <: Exception end
 
Line 1,908 ⟶ 2,016:
end
 
foo()</langsyntaxhighlight>
 
{{out}}
Line 1,918 ⟶ 2,026:
 
=={{header|Kotlin}}==
<langsyntaxhighlight lang="scala">// version 1.0.6
 
class U0 : Throwable("U0 occurred")
Line 1,946 ⟶ 2,054:
fun main(args: Array<String>) {
foo()
}</langsyntaxhighlight>
 
{{out}}
Line 1,963 ⟶ 2,071:
There is no explicit try block. A catch implicitly wraps the instructions preceding it within a block into a try block.
 
<syntaxhighlight lang="langur">val .U0 = h{"msg": "U0"}
Prior to 0.7, you would use .err instead of _err for an implicit exception variable.
 
<lang langur>val .U0 = h{"msg": "U0"}
val .U1 = h{"msg": "U1"}
 
val .baz = ffn(.i) { throw if(.i==0: .U0; .U1) }
val .bar = ffn(.i) { .baz(.i) }
 
val .foo = fimpure fn() {
for .i in [0, 1] {
.bar(.i)
catch if _err["msg"] == .U0["msg"] {
if _err'msg writeln "caught== .U0'msg in .foo()"{
} else { writeln "caught .U0 in .foo()"
} else throw{
} throw
}
}
}
}
 
.foo()</lang>
</syntaxhighlight>
 
{{out}}
Line 1,993 ⟶ 2,102:
but we can easily add one like so.
 
<langsyntaxhighlight Lassolang="lasso">define try(exception) => {
local(
gb = givenblock,
Line 2,032 ⟶ 2,141:
var(bazzed) ? fail('U1') | $bazzed = true
fail('U0')
}</langsyntaxhighlight>
 
{{out}}
Line 2,055 ⟶ 2,164:
 
=={{header|Lua}}==
<langsyntaxhighlight Lualang="lua">local baz_counter=1
function baz()
if baz_counter==1 then
Line 2,088 ⟶ 2,197:
 
foo()
</syntaxhighlight>
</lang>
output:
<pre>lua: errorexample.lua:31: U1
Line 2,099 ⟶ 2,208:
 
=={{header|Maple}}==
<syntaxhighlight lang="maple">baz := proc( which )
{{incomplete|Maple|"Show/describe what happens when the program is run."}}
if ( which = 0 ) then
<lang Maple>num_times:=0:
error "U0";
baz := proc()
else
global num_times := num_times + 1;
error `if`(num_times <= 1, "U0",error "U1");
end;
end proc:
 
bar := proc( which )
baz( which );
end proc;:
 
foo := proc()
local i;
for i from 0 to 1 do
bar();try
bar(i);
catch "U0":
end;
end do;
end proc;</lang>:
 
foo();</syntaxhighlight>
{{out}}
<syntaxhighlight lang="maple">Error, (in baz) U1</syntaxhighlight>
 
=={{header|Mathematica}} / {{header|Wolfram Language}}==
<langsyntaxhighlight lang="mathematica">foo[] := Catch[ bar[1]; bar[2]; ]
 
bar[i_] := baz[i];
Line 2,124 ⟶ 2,241:
baz[i_] := Switch[i,
1, Throw["Exception U0 in baz"];,
2, Throw["Exception U1 in baz"];]</langsyntaxhighlight>
Output:
<pre> foo[]
Line 2,130 ⟶ 2,247:
 
=={{header|MATLAB}} / {{header|Octave}}==
<langsyntaxhighlight MATLABlang="matlab">function exceptionsCatchNestedCall()
function foo()
 
Line 2,160 ⟶ 2,277:
foo();
 
end</langsyntaxhighlight>
{{out}}
<langsyntaxhighlight MATLABlang="matlab">>> exceptionsCatchNestedCall()
message: [1x177 char]
identifier: 'BAZ:U0'
Line 2,171 ⟶ 2,288:
 
Error in ==> exceptionsCatchNestedCall at 29
foo();</langsyntaxhighlight>
 
=={{header|Nemerle}}==
<langsyntaxhighlight Nemerlelang="nemerle">using System;
using System.Console;
 
Line 2,224 ⟶ 2,341:
}
}
}</langsyntaxhighlight>
{{out}}
<pre>Exception U0 caught.
Line 2,234 ⟶ 2,351:
 
=={{header|Nim}}==
<langsyntaxhighlight lang="nim">type U0 = object of Exception
type U1 = object of Exception
 
Line 2,251 ⟶ 2,368:
echo "Function foo caught exception U0"
 
foo()</langsyntaxhighlight>
{{out}}
<pre>Function foo caught exception U0
Line 2,263 ⟶ 2,380:
 
=={{header|Objective-C}}==
<langsyntaxhighlight lang="objc">@interface U0 : NSObject { }
@end
@interface U1 : NSObject { }
Line 2,305 ⟶ 2,422:
}
return 0;
}</langsyntaxhighlight>
{{out}}
<pre>
Line 2,314 ⟶ 2,431:
=={{header|OCaml}}==
Exceptions are used everywhere in OCaml, they are easy to write, and they are cheap.
<langsyntaxhighlight lang="ocaml">exception U0
exception U1
 
Line 2,330 ⟶ 2,447:
done
 
let () = foo ()</langsyntaxhighlight>
{{out}}
<pre>
Line 2,339 ⟶ 2,456:
=={{header|Oforth}}==
 
<langsyntaxhighlight Oforthlang="oforth">Exception Class new: U0
Exception Class new: U1
Line 2,349 ⟶ 2,466:
try: e [ 0 bar ] when: [ e isKindOf(U0) ifTrue: [ "Catched" .cr ] else: [ e throw ] ]
try: e [ 1 bar ] when: [ e isKindOf(U0) ifTrue: [ "Catched" .cr ] else: [ e throw ] ]
"Done" . ;</langsyntaxhighlight>
 
{{out}}
Line 2,362 ⟶ 2,479:
 
Exceptions are caught by pattern matching.
<langsyntaxhighlight lang="oz">declare
proc {Foo}
for I in 1..2 do
Line 2,382 ⟶ 2,499:
end
in
{Foo}</langsyntaxhighlight>
 
{{out}}
Line 2,397 ⟶ 2,514:
 
=={{header|PARI/GP}}==
<langsyntaxhighlight lang="parigp">call = 0;
 
U0() = error("x = ", 1, " should not happen!");
Line 2,403 ⟶ 2,520:
baz(x) = if(x==1, U0(), x==2, U1());x;
bar() = baz(call++);
foo() = if(!call, iferr(bar(), E, printf("Caught exception, call=%d",call)), bar())</langsyntaxhighlight>
 
Output 1. call to foo():<pre>Caught exception, call=1</pre>
Line 2,425 ⟶ 2,542:
=={{header|Perl}}==
Note: Both exceptions are caught and one is re-raised rather than only one being caught.
<langsyntaxhighlight lang="perl">sub foo {
foreach (0..1) {
eval { bar($_) };
Line 2,442 ⟶ 2,559:
}
 
foo();</langsyntaxhighlight>
{{out}}
<pre>
Line 2,451 ⟶ 2,568:
 
=={{header|Phix}}==
{{libheader|Phix/basics}}
Phix does not have "exception classes" as such, instead you can just throw any string (on it's own) or any integer, optionally
with any (deeply nested) user_data that you like. All exceptions are always caught, however rethrowing is trivial.<br>
As per the discussion for Go, I should say that "bar(); bar();" cannot work - if you catch an exception from the first call,
control resumes within the catch handler, with no way to invoke that second bar(). But a simple loop does the trick.
<!--<syntaxhighlight lang="phix">-->
<lang Phix>constant U0 = 0,
<span style="color: #008080;">constant</span> <span style="color: #000000;">U0</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">0<span style="color: #0000FF;">,</span>
U1 = 1
<span style="color: #000000;">U1</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">1</span>
 
integer count = 0
<span style="color: #004080;">integer</span> <span style="color: #000000;">count</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">0</span>
 
procedure baz()
<span style="color: #008080;">procedure</span> <span style="color: #000000;">baz<span style="color: #0000FF;">(<span style="color: #0000FF;">)</span>
count += 1
<span style="color: #000000;">count</span> <span style="color: #0000FF;">+=</span> <span style="color: #000000;">1</span>
if count=1 then
<span style="color: #008080;">if</span> <span style="color: #000000;">count<span style="color: #0000FF;">=<span style="color: #000000;">1</span> <span style="color: #008080;">then</span>
throw(U0,{{"any",{{"thing"},"you"}},"like"})
<span style="color: #008080;">throw<span style="color: #0000FF;">(<span style="color: #000000;">U0<span style="color: #0000FF;">,<span style="color: #0000FF;">{<span style="color: #0000FF;">{<span style="color: #008000;">"any"<span style="color: #0000FF;">,<span style="color: #0000FF;">{<span style="color: #0000FF;">{<span style="color: #008000;">"thing"<span style="color: #0000FF;">}<span style="color: #0000FF;">,<span style="color: #008000;">"you"<span style="color: #0000FF;">}<span style="color: #0000FF;">}<span style="color: #0000FF;">,<span style="color: #008000;">"like"<span style="color: #0000FF;">}<span style="color: #0000FF;">)</span>
else
<span style="color: #008080;">else</span>
throw(U1)
<span style="color: #008080;">throw<span style="color: #0000FF;">(<span style="color: #000000;">U1<span style="color: #0000FF;">)</span>
end if
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
end procedure
<span style="color: #008080;">end</span> <span style="color: #008080;">procedure</span>
 
procedure bar()
<span style="color: #008080;">procedure</span> <span style="color: #000000;">bar<span style="color: #0000FF;">(<span style="color: #0000FF;">)</span>
baz()
<span style="color: #000000;">baz<span style="color: #0000FF;">(<span style="color: #0000FF;">)</span>
end procedure
<span style="color: #008080;">end</span> <span style="color: #008080;">procedure</span>
 
procedure foo()
<span style="color: #008080;">procedure</span> <span style="color: #000000;">foo<span style="color: #0000FF;">(<span style="color: #0000FF;">)</span>
for i=1 to 2 do
<span style="color: #008080;">for</span> <span style="color: #000000;">i<span style="color: #0000FF;">=<span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #000000;">2</span> <span style="color: #008080;">do</span>
try
<span style="color: bar()#008080;">try</span>
<span style="color: #000000;">bar<span style="color: #0000FF;">(<span style="color: #0000FF;">)</span>
catch e
<span style="color: #008080;">catch</span> <span style="color: #000000;">e</span>
if e[E_CODE]=U0 then
<span style="color: #008080;">if</span> <span style="color: #000000;">e<span style="color: #0000FF;">[<span style="color: #000000;">E_CODE<span style="color: #0000FF;">]<span style="color: #0000FF;">=<span style="color: #000000;">U0</span> <span style="color: #008080;">then</span>
?e[E_USER]
<span style="color: #0000FF;">?<span style="color: #000000;">e<span style="color: #0000FF;">[<span style="color: #000000;">E_USER<span style="color: #0000FF;">]</span>
else
<span style="color: throw(e) -- (terminates)#008080;">else</span>
<span style="color: #008080;">throw<span style="color: #0000FF;">(<span style="color: #000000;">e<span style="color: #0000FF;">)</span> <span style="color: #000080;font-style:italic;">-- (terminates)</span>
end if
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
end try
<span style="color: #008080;">end</span> <span style="color: #008080;">try</span>
puts(1,"still running...\n")
<span style="color: #7060A8;">puts<span style="color: #0000FF;">(<span style="color: #000000;">1<span style="color: #0000FF;">,<span style="color: #008000;">"still running...\n"<span style="color: #0000FF;">)</span>
end for
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
puts(1,"not still running...\n")
<span style="color: #7060A8;">puts<span style="color: #0000FF;">(<span style="color: #000000;">1<span style="color: #0000FF;">,<span style="color: #008000;">"not still running...\n"<span style="color: #0000FF;">)</span>
end procedure
<span style="color: #008080;">end</span> <span style="color: #008080;">procedure</span>
 
foo()</lang>
<span style="color: #000000;">foo<span style="color: #0000FF;">(<span style="color: #0000FF;">)
<!--</syntaxhighlight>-->
{{out}}
<pre>
Line 2,509 ⟶ 2,629:
 
=={{header|PicoLisp}}==
<langsyntaxhighlight PicoLisplang="picolisp">(de foo ()
(for Tag '(U0 U1)
(catch 'U0
Line 2,521 ⟶ 2,641:
 
(mapc trace '(foo bar baz))
(foo)</langsyntaxhighlight>
{{out}}
<pre> foo :
Line 2,533 ⟶ 2,653:
 
=={{header|PL/I}}==
<syntaxhighlight lang="pl/i">
<lang PL/I>
/* Exceptions: Catch an exception thrown in a nested call */
test: proc options (main);
Line 2,564 ⟶ 2,684:
m = foo();
end test;
</syntaxhighlight>
</lang>
 
DESCRIPTION OF EXECUTION:
Line 2,596 ⟶ 2,716:
There is no extra syntax to add to functions and/or methods such as ''bar'',
to say what exceptions they may raise or pass through them:
<langsyntaxhighlight lang="python">class U0(Exception): pass
class U1(Exception): pass
 
Line 2,612 ⟶ 2,732:
raise U1 if i else U0
 
foo()</langsyntaxhighlight>
{{out}}
<pre>
Line 2,634 ⟶ 2,754:
through the nested function calls together with the name of the
uncaught exception, (U1) to stderr, then quit the running program.
 
=={{header|Quackery}}==
 
<syntaxhighlight lang="quackery"> [ this ] is U0
 
[ this ] is U1
 
[ 0 = iff U0 else U1
message put bail ] is baz ( n --> )
 
[ baz ] is bar ( n --> )
 
[ 2 times
[ i^
1 backup
bar
bailed if
[ message share
U0 oats iff
[ say "Exception U0 raised." cr
echostack
$ "Press enter to continue"
input drop
message release
drop ]
else [ drop bail ] ] ] ] is foo</syntaxhighlight>
 
{{out}}
 
Testing in the Quackery shell, first with trapping the exception U1, and then without trapping the exception U1 (this is bad practice). Before invoking <code>foo</code> we put some arbitrary data on the stack to show if and how it is affected.
 
<pre>/O> 111 222 333
...
 
Stack: 111 222 333
 
/O> 0 backup foo bailed if [ message take echo ]
...
Exception U0 raised.
Stack: 111 222 333 0
Press enter to continue
U1
Stack: 111 222 333
 
/O> foo
...
Exception U0 raised.
Stack: 111 222 333 0
Press enter to continue
 
Problem: Cannot remove an immovable item.
Quackery Stack: 111 222 333
Return stack: {[...] 0} {quackery 1} {[...] 11} {shell 5} {quackery 1} {[...] 0} {foo 2} {times 6}
{[...] 10} {[...] 6} {[...] 7} {[...] 1} {bail 1}
 
/O>
 
Stack empty.
</pre>
 
=={{header|R}}==
Line 2,640 ⟶ 2,819:
in your own environment.
See ?new.env and ?get.
<syntaxhighlight lang="r">
<lang r>
number_of_calls_to_baz <- 0
 
Line 2,656 ⟶ 2,835:
stop(e)
}
</syntaxhighlight>
</lang>
Example Usage:
<syntaxhighlight lang="r">
<lang r>
foo() # Error: U0
traceback()
</syntaxhighlight>
</lang>
{{out}}
<pre>
Line 2,673 ⟶ 2,852:
 
=={{header|Racket}}==
<langsyntaxhighlight lang="racket">
#lang racket
 
Line 2,693 ⟶ 2,872:
(foo)
</syntaxhighlight>
</lang>
{{out}}
<langsyntaxhighlight lang="racket">
Function foo caught exception U0
. . failed 1
</syntaxhighlight>
</lang>
 
=={{header|Raku}}==
(formerly Perl 6)
{{trans|Perl}}
<syntaxhighlight lang="raku" perl6line>sub foo() {
for 0..1 -> $i {
bar $i;
Line 2,716 ⟶ 2,895:
sub baz($i) { die "U$i" }
 
foo;</langsyntaxhighlight>
{{out}}
<pre>Function foo caught exception U0
Line 2,729 ⟶ 2,908:
<br>This type of exception handling (in REXX) has its limitation &nbsp;
(the label is known global to the program, but not to external subroutines).
<langsyntaxhighlight lang="rexx">/*REXX program creates two exceptions and demonstrates how to handle (catch) them. */
call foo /*invoke the FOO function (below). */
say 'The REXX mainline program has completed.' /*indicate that Elroy was here. */
Line 2,750 ⟶ 2,929:
/* [↓] this U0 subroutine is ignored.*/
U0: return -1 /*handle exception if not caught. */
U1: return -1 /* " " " " " */</langsyntaxhighlight>
'''output'''
<pre>
Line 2,758 ⟶ 2,937:
 
=={{header|Ruby}}==
<langsyntaxhighlight lang="ruby">def foo
2.times do |i|
begin
Line 2,780 ⟶ 2,959:
class U1 < StandardError; end
 
foo</langsyntaxhighlight>
The first call to foo causes the U0 exception. It gets rescued.
The second call results in a U1 exception which is not rescued,
Line 2,796 ⟶ 2,975:
=={{header|Rust}}==
Rust has panics, which are similar to exceptions in that they default to unwinding the stack and the unwinding can be caught. However, panics can be configured to simply abort the program and thus cannot be guaranteed to be catchable. Panics should only be used for situations which are truly unexpected. It is prefered to return an Option or Result when a function can fail. <code>Result<T, U></code> is an enum (or sum type) with variants <code>Ok(T)</code> and <code>Err(U)</code>, representing a success value or failure value. <code>main</code> can return a Result, in which case the debug representation of the error will be shown.
<langsyntaxhighlight Rustlang="rust">#[derive(Debug)]
enum U {
U0(i32),
Line 2,827 ⟶ 3,006:
fn main() -> Result<(), U> {
foo()
}</langsyntaxhighlight>
{{out}}
<pre>Caught U0 in foo: 42
Line 2,834 ⟶ 3,013:
=={{header|Scala}}==
{{libheader|Scala}}
<langsyntaxhighlight Scalalang="scala">object ExceptionsTest extends App {
class U0 extends Exception
class U1 extends Exception
Line 2,853 ⟶ 3,032:
foo
}
</syntaxhighlight>
</lang>
Exception U0 is caught, exception U1 is caught and re-thrown.
Program execution is terminated as the U1 exception is not caught
Line 2,862 ⟶ 3,041:
is not [http://seed7.sourceforge.net/manual/errors.htm#Handlers handled]
the program is terminated and a [http://seed7.sourceforge.net/manual/errors.htm#Stack_trace stack trace] is written.
<langsyntaxhighlight lang="seed7">$ include "seed7_05.s7i";
 
const EXCEPTION: U0 is enumlit;
Line 2,897 ⟶ 3,076:
begin
foo;
end func;</langsyntaxhighlight>
 
{{out}}
Line 2,915 ⟶ 3,094:
 
=={{header|Sidef}}==
<langsyntaxhighlight lang="ruby">func baz(i) { die "U#{i}" };
func bar(i) { baz(i) };
 
func foo {
[0, 1].each { |i|
try { bar(i) }
catch { |_, msg|
msg ~~ /^U0/  ? say "Function foo() caught exception U0"
 : die msg; # re-raise the exception
};
}
}
 
foo();</langsyntaxhighlight>
{{out}}
<pre>
Line 2,937 ⟶ 3,116:
=={{header|Smalltalk}}==
{{works with|GNU Smalltalk}}
<langsyntaxhighlight lang="smalltalk">
Exception subclass: #U0.
Exception subclass: #U1.
Line 2,963 ⟶ 3,142:
"Thirds time's a charm..."]
]
</syntaxhighlight>
</lang>
 
Running the code:
<syntaxhighlight lang="smalltalk">
<lang Smalltalk>
st> Foo new foo
'Call to bar was aborted by exception U0'
Line 2,978 ⟶ 3,157:
UndefinedObject>>executeStatements (a String:1)
nil
</syntaxhighlight>
</lang>
 
Explanation:<br/>
Line 3,000 ⟶ 3,179:
=={{header|Swift}}==
{{works with|Swift|2.x+}}
<langsyntaxhighlight lang="swift">enum MyException : ErrorType {
case U0
case U1
Line 3,027 ⟶ 3,206:
}
 
try foo()</langsyntaxhighlight>
{{out}}
<pre>
Line 3,038 ⟶ 3,217:
 
{{works with|Tcl|8.5}}
<langsyntaxhighlight lang="tcl">package require Tcl 8.5
 
proc foo {} {
Line 3,063 ⟶ 3,242:
 
foo
foo</langsyntaxhighlight>
{{out}}
<pre>$ tclsh85 exceptions.tcl
Line 3,080 ⟶ 3,259:
=={{header|TXR}}==
 
<langsyntaxhighlight lang="txr">@(defex u0)
@(defex u1)
@(define baz (x))
Line 3,107 ⟶ 3,286:
@ (end)
@(end)
@(foo)</langsyntaxhighlight>
 
{{out|Run}}
Line 3,118 ⟶ 3,297:
1
</pre>
 
=={{header|uBasic/4tH}}==
uBasic/4tH only captures an exception when a procedure is called by the function TRY(). TRY() returns zero when no exception was thrown. It returns the non-zero errorcode when an exception was thrown. RAISE can only throw user exceptions. If a procedure is called using the normal PROC keyword exceptions are not caught.
<syntaxhighlight lang="uBasic/4tH">u = 0 ' this is U0
v = 1 ' this is U1
 
Proc _foo ' call foo
End
 
_foo
For x = u To v ' throw U0 to U1
If x = u ' catch U0
If Try(_bar(x)) Then ' try to execute bar
Print "Procedure foo caught exception U0"
EndIf ' catch exception and write msg
Else ' don't catch other exceptions
Proc _bar(x)
EndIf
Next
Return
 
_bar
Param (1) ' bar takes a single parameter
Proc _baz(a@) ' bar calls baz
Return
 
_baz
Param (1) ' baz takes a single parameter
Raise a@ ' baz throws the exception
Return</syntaxhighlight>
{{Out}}
<pre>Procedure foo caught exception U0
 
Q Exception raised, 16092559880829058:136</pre>
 
=={{header|Ursala}}==
Line 3,123 ⟶ 3,336:
if baz raises an exception.
The exception is caught or not by foo.
<langsyntaxhighlight Ursalalang="ursala">#import std
 
baz =
Line 3,141 ⟶ 3,354:
guard(
:/'foo received this result from normal termination of bar:'+ bar,
'U0'?=z/~& :/'foo caught an exception with this error message:')</langsyntaxhighlight>
Note that the definition of bar includes no conditional (?) or exception
handling operators, and is written without regard for any exceptions.
Line 3,161 ⟶ 3,374:
=={{header|Visual Basic .NET}}==
 
<langsyntaxhighlight lang="vbnet">Class U0
Inherits Exception
End Class
Line 3,197 ⟶ 3,410:
End If
End Sub
End Module</langsyntaxhighlight>
 
Control passes to the Catch block after U0 is thrown, and so the second call to Bar() is not made.
Line 3,206 ⟶ 3,419:
To prevent this, a loop can be used to run the entire Try statement twice:
 
<langsyntaxhighlight lang="vbnet"> Sub Foo()
For i = 1 To 2
Try
Line 3,214 ⟶ 3,427:
End Try
Next
End Sub</langsyntaxhighlight>
 
{{out}}
Line 3,229 ⟶ 3,442:
 
We can use that approach here, re-throwing the second (uncaught) exception so that it terminates the script.
<langsyntaxhighlight ecmascriptlang="wren">var U0 = "U0"
var U1 = "U1"
 
Line 3,256 ⟶ 3,469:
}
 
foo.call()</langsyntaxhighlight>
 
{{out}}
Line 3,264 ⟶ 3,477:
[./exceptions_nested line 23] in new(_) block argument
[./exceptions_nested line 28] in (script)
</pre>
 
=={{header|XPL0}}==
The obvious solution is to simply do the catch error handling at the
point where the error is detected. However, XPL0's Restart intrinsic can
be used to do something similar to C++'s catch operation. This technique
avoids having to pass an error condition back up through several levels
of function calls. (Technically, these functions are actually procedures
because they don't return a value, but XPL0 doesn't enforce the
distinction.)
<syntaxhighlight lang "XPL0">func U0; \Exception caused by square root of negative value
real X;
X:= Sqrt(-42.);
 
func U1; \Exception caused by opening a non-existent file for input
int F;
F:= FOpen("unobtainium.txt", 0);
 
func Baz;
int CallNo;
[CallNo:= [1]; \static-like variable
if CallNo(0) = 1 then \first time Baz is called
[CallNo(0):= 2;
Text(0, "Calling U0^m^j");
Trap(false); \turn off error trapping to prevent program abort
U0;
Restart;
]
else \second time Baz is called
[Text(0, "Calling U1^m^j");
U1; \error trapping is still disabled
];
];
 
func Bar;
Baz;
 
func Foo;
Bar;
 
int Err;
[Err:= GetErr; \get the exception error after the program is restarted
if Err then \reading GetErr resets any error number to 0, = no error
[Text(0, "Error "); IntOut(0, Err); Text(0, " detected^m^j")];
Foo;
Text(0, "Finished^m^j");
] \second exception is pending, and it will be displayed
</syntaxhighlight>
{{out}}
<pre>
Calling U0
Error 10 detected
Calling U1
Finished
 
RUN-TIME ERROR 3: I/O
</pre>
 
=={{header|zkl}}==
<langsyntaxhighlight lang="zkl">class U0(Exception.Exception){fcn init{Exception.init("U0")}}
class U1(Exception.Exception){fcn init{Exception.init("U1")}}
 
Line 3,273 ⟶ 3,542:
fcn bar(e){baz(e)}
fcn baz(e){throw(e)}
foo()</langsyntaxhighlight>
{{out}}
<pre>
885

edits