Exceptions/Catch an exception thrown in a nested call: Difference between revisions
Content added Content deleted
Not a robot (talk | contribs) (Add APL) |
m (→{{header|Phix}}: added syntax colouring the hard way, phix/basics) |
||
Line 2,451: | Line 2,451: | ||
=={{header|Phix}}== |
=={{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 |
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> |
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, |
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. |
control resumes within the catch handler, with no way to invoke that second bar(). But a simple loop does the trick. |
||
<lang Phix> |
<!--<lang Phix>--> |
||
<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: #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: #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> |
|||
⚫ | |||
<span style="color: #000000;">foo<span style="color: #0000FF;">(<span style="color: #0000FF;">) |
|||
⚫ | |||
{{out}} |
{{out}} |
||
<pre> |
<pre> |