pascalabcnet/PABCNetHelp/LangGuide/Operators/try_except.html

97 lines
6.6 KiB
HTML
Raw Permalink Normal View History

<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>