pascalabcnet/PABCNetHelp/LangGuide/Operators/try_except.html

97 lines
4.5 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<html>
<head>
<object type="application/x-oleobject" classid="clsid:1e2a7bd0-dab9-11d0-b93a-00c04fc99f9e">
<param name="Keyword" value="try">
<param name="Keyword" value="except">
<param name="Keyword" value="on">
</object>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
<title></title>
<link rel="StyleSheet" href="../../default.css">
</head>
<body>
<H1>Оператор try ... except</H1>
<p>Оператор <code><b>try</b></code> ... <code><b>except</b></code> имеет вид:</p>
<blockquote>
<p><code><b>try</b><br>
&nbsp;</code>&nbsp; <i>операторы</i><br>
<code><b>except</b><br>
&nbsp;</code>&nbsp; <i>блок обработки исключений</i><br>
<code><b>end</b>; </code></p>
</blockquote>
<p>Блок <code><b>try</b></code> называется
<i>защищаемым блоком</i>.
Если при выполнении программы в нем происходит ошибка, то он завершается и
выполнение передается блоку <code><b>except</b></code>. Если исключение
обрабатывается в блоке <code><b>except</b></code>, то после его обработки
программа продолжает выполняться с оператора, следующего за <code><b>try</b></code> ...
<code><b>except</b></code> ... <code><b>end</b></code>. Если исключение остается необработанным и имеется объемлющий
блок <code><b>try</b></code>, то выполнение передается
его блоку <code><b>except</b></code>. Если объемлющего
блока <code><b>try</b></code> нет, то программа
завершается с ошибкой. Наконец, если в блоке <code><b>try</b></code>
ошибки не произошло, то блок <code><b>except</b></code>
игнорируется и выполнение программы продолжается дальше.</p>
<p>Если в процессе обработки исключения (в блоке <code>
<b>except</b></code>) произошло другое исключение, то текущий
блок <code><b>except</b></code> завершается, первое
исключение считается необработанным и обработка нового исключения передается
объемлющему блоку <code><b>try</b></code>. Таким образом,
в каждый момент времени существует максимум одно необработанное исключение.</p>
<p><i>Блок обработки
исключений</i> представляет собой либо последовательность
операторов, разделенных точкой с запятой, либо последовательность обработчиков
исключений вида</p>
<blockquote>
<p><code><b>on</b></code> <i>имя</i><code>:</code> <i>тип</i> <code><b>do</b></code> <i>оператор</i></p>
</blockquote>
<p>Обработчики разделяются символом '<code>;</code>',
после последнего обработчика также может следовать символ '<code>;</code>'.
Здесь <i>тип</i> - тип исключения
(должен быть производным от стандартного типа <code>Exception</code>),
<i>имя</i> - имя переменной исключения (имя с последующим двоеточием может быть
опущено). В первом случае при обработке исключения выполняются все операторы из
блока <code><b>except</b></code>. Во втором случае среди
обработчиков осуществляется поиск типа текущего исключения (обработчики
перебираются последовательно от первого до последнего), и если обработчик
найден, то выполняется соответствующий оператор обработки исключения, в
противном случае исключение считается необработанным и передается объемлющему
блоку <code><b>try</b></code>. В последнем случае после всех
обработчиков <code><b>on</b></code> может идти ветвь <code><b>else</b></code>,
которая обязательно обработает исключение, если ни один из обработчиков не
выполнился.</p>
<p>Следует обратить внимание, что имя переменной исключения в
разных обработчиках может быть одинаковым, т.е. оно локально по отношению к
обработчику.</p>
<p>Поиск типа исключения в обработчиках производится с учетом
наследования: исключение будет обработано, если оно принадлежит к указанному в
обработчике типу или производному от него. Поэтому принято записывать вначале
обработчики производных классов, а затем - обработчики базовых (в противном
случае обработчик исключения производного класса никогда не сработает).
Обработчик исключения <code>Exception</code> обрабатывает
все возможные исключения и поэтому должен быть записан последним.</p>
<p><b>Пример.</b></p>
<blockquote>
<p><code><b>var </b>a: <b>array </b>[1..10] <b>of </b>integer;<b><br>
try</b> <br>
<b>&nbsp; var </b>i: integer;<br>
&nbsp; readln(i);<br>
&nbsp; writeln(a[i] <b>div</b> i);<br>
&nbsp; ...<br>
<b>except</b><br>
&nbsp; <b>on</b> System.DivideByZeroException <b>do</b><br>
&nbsp;&nbsp;&nbsp; writeln('Деление на 0');&nbsp; <br>
&nbsp; <b>on</b> e: System.IndexOutOfRangeException <b>do</b><br>
&nbsp;&nbsp;&nbsp; writeln(e.Message);<br>
&nbsp; <b>on</b> System.FormatException <b>do</b><br>
&nbsp;&nbsp;&nbsp; writeln('Неверный формат ввода');<br>
&nbsp; <b>else</b> writeln('Какое-то другое
исключение');<br>
<b>end</b>;</code></p>
</blockquote>
<p>&nbsp;</p>
</body>
</html>