/
n-dimens
/
pascalabcnet
Обзор
Документация
Войти
/
n-dimens
/
pascalabcnet
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
PABCNetHelp/LangGuide/Operators/try_except.html
97 строк
7 KB
samuraiGH
adding working-tree-encoding attribute (#3325)
07 ноя 2025, 16:12
Не верифицирован
07 ноя 2025, 16:12
cf1fd29
Код
Авторство
О чём код?
<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>