97 lines
6.6 KiB
HTML
97 lines
6.6 KiB
HTML
<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>
|
||
</code> <i>операторы</i><br>
|
||
<code><b>except</b><br>
|
||
</code> <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> var </b>i: integer;<br>
|
||
readln(i);<br>
|
||
writeln(a[i] <b>div</b> i);<br>
|
||
...<br>
|
||
<b>except</b><br>
|
||
<b>on</b> System.DivideByZeroException <b>do</b><br>
|
||
writeln('Деление на 0'); <br>
|
||
<b>on</b> e: System.IndexOutOfRangeException <b>do</b><br>
|
||
writeln(e.Message);<br>
|
||
<b>on</b> System.FormatException <b>do</b><br>
|
||
writeln('Неверный формат ввода');<br>
|
||
<b>else</b> writeln('Какое-то другое
|
||
исключение');<br>
|
||
<b>end</b>;</code></p>
|
||
</blockquote>
|
||
<p> </p>
|
||
</body>
|
||
|
||
</html> |