comparison website/src/manual.html @ 1520:d9a5405a3102

try statement
author Franklin Schmidt <fschmidt@gmail.com>
date Sun, 21 Jun 2020 18:14:13 -0600
parents 56fb5cd8228d
children d3e61cd2aca0
comparison
equal deleted inserted replaced
1519:3ebf9781707c 1520:d9a5405a3102
50 <li><a href="#blocks">Blocks</a></li> 50 <li><a href="#blocks">Blocks</a></li>
51 <li><a href="#chunks">Chunks</a></li> 51 <li><a href="#chunks">Chunks</a></li>
52 <li><a href="#assignment">Assignment</a></li> 52 <li><a href="#assignment">Assignment</a></li>
53 <li><a href="#control">Control Structures</a></li> 53 <li><a href="#control">Control Structures</a></li>
54 <li><a href="#for">For Statement</a></li> 54 <li><a href="#for">For Statement</a></li>
55 <li><a href="#try">Try Statement</a></li>
55 <li><a href="#fn_stmt">Function Calls as Statements</a></li> 56 <li><a href="#fn_stmt">Function Calls as Statements</a></li>
56 <li><a href="#local_stmt">Local Declarations</a></li> 57 <li><a href="#local_stmt">Local Declarations</a></li>
57 <li><a href="#template_stmt">Template Statements</a></li> 58 <li><a href="#template_stmt">Template Statements</a></li>
58 </ul> 59 </ul>
59 </li> 60 </li>
241 242
242 <p> 243 <p>
243 Luan code can explicitly generate an error by calling the 244 Luan code can explicitly generate an error by calling the
244 <a href="#Luan.error"><code>error</code></a> function. 245 <a href="#Luan.error"><code>error</code></a> function.
245 If you need to catch errors in Luan, 246 If you need to catch errors in Luan,
246 you can use <a href="#Luan.pcall"><code>pcall</code></a> or <a href="#Luan.try"><code>try</code></a> 247 you can use the <a href="#try">Try Statement</code></a>.
247 to call a given function in <em>protected mode</em>.
248 248
249 249
250 <p> 250 <p>
251 Whenever there is an error, 251 Whenever there is an error,
252 an <em>error table</em> 252 an <em>error table</em>
1039 1039
1040 </ul> 1040 </ul>
1041 1041
1042 1042
1043 1043
1044 <h4 heading><a name="try" href="#for">Try Statement</a></h4>
1045
1046 <p>The <b>try</b> statement has the same semantics as in Java.</p>
1047
1048 <pre>
1049 stat ::= <b>try</b> block [<b>catch</b> Name block] [<b>finally</b> block] end_try
1050 end_try ::= <b>end_try</b> | <b>end</b>
1051 </pre>
1052
1053
1054
1044 1055
1045 <h4 heading><a name="fn_stmt" href="#fn_stmt">Function Calls as Statements</a></h4> 1056 <h4 heading><a name="fn_stmt" href="#fn_stmt">Function Calls as Statements</a></h4>
1046 1057
1047 <p> 1058 <p>
1048 To allow possible side-effects, 1059 To allow possible side-effects,
1938 <p> 1949 <p>
1939 will iterate over all key&ndash;value pairs of table <code>t</code>. 1950 will iterate over all key&ndash;value pairs of table <code>t</code>.
1940 1951
1941 1952
1942 1953
1943 <h4 heading><a name="Luan.pcall" href="#Luan.pcall"><code>Luan.pcall (f [, arg1, &middot;&middot;&middot;])</code></a></h4>
1944
1945 <p>
1946 Calls function <code>f</code> with
1947 the given arguments in <em>protected mode</em>.
1948 This means that any error inside&nbsp;<code>f</code> is not propagated;
1949 instead, <code>pcall</code> catches the error
1950 and returns a status code.
1951 Its first result is the status code (a boolean),
1952 which is true if the call succeeds without errors.
1953 In such case, <code>pcall</code> also returns all results from the call,
1954 after this first result.
1955 In case of any error, <code>pcall</code> returns <b>false</b> plus the error.
1956
1957
1958
1959
1960 <p> 1954 <p>
1961 <hr><h3><a name="pdf-print"><code>print (&middot;&middot;&middot;)</code></a></h3> 1955 <hr><h3><a name="pdf-print"><code>print (&middot;&middot;&middot;)</code></a></h3>
1962 Receives any number of arguments 1956 Receives any number of arguments
1963 and prints their values to <code>stdout</code>, 1957 and prints their values to <code>stdout</code>,
1964 using the <a href="#pdf-tostring"><code>tostring</code></a> function to convert each argument to a string. 1958 using the <a href="#pdf-tostring"><code>tostring</code></a> function to convert each argument to a string.
2072 If the metatable of <code>v</code> has a <code>"__to_string"</code> field, 2066 If the metatable of <code>v</code> has a <code>"__to_string"</code> field,
2073 then <code>to_string</code> calls the corresponding value 2067 then <code>to_string</code> calls the corresponding value
2074 with <code>v</code> as argument, 2068 with <code>v</code> as argument,
2075 and uses the result of the call as its result. 2069 and uses the result of the call as its result.
2076 2070
2077
2078
2079 <h4 heading><a name="Luan.try" href="#Luan.try"><code>Luan.try (t, &middot;&middot;&middot;)</code></a></h4>
2080
2081 <p>
2082 Implements try-catch as found in other languages where each block is in table <code>t</code>. <code>t[1]</code> is the "try" block. The <code>t.catch</code> and <code>t.finally</code> blocks are optional. Any extra arguments are passed to the "try" function. Returns the result of the "try" block or the "catch" block.
2083
2084 <p>
2085 Example use:
2086
2087 <pre>
2088 try {
2089 function()
2090 a_dangerous_fn()
2091 end
2092 catch = function(e)
2093 -- handle error
2094 end
2095 finally = function()
2096 -- clean up
2097 end
2098 }
2099 </pre>
2100
2101 <p>
2102 Could be defined as:
2103
2104 <pre>
2105 function Luan.try(t)
2106 local r = { <a href="#Luan.pcall">Luan.pcall</a>(t[1]) }
2107 if r[1] then
2108 Table.remove(r,1)
2109 elseif t.catch ~= nil then
2110 r = { t.catch(r[2]) }
2111 else
2112 t.finally and t.finally()
2113 r[2].throw()
2114 end
2115 t.finally and t.finally()
2116 return Table.unpack(r)
2117 end
2118 </pre>
2119 2071
2120 2072
2121 <h4 heading><a name="Luan.type" href="#Luan.type"><code>Luan.type (v)</code></a></h4> 2073 <h4 heading><a name="Luan.type" href="#Luan.type"><code>Luan.type (v)</code></a></h4>
2122 2074
2123 <p> 2075 <p>