94 lines
3.5 KiB
HTML
94 lines
3.5 KiB
HTML
<html>
|
||
|
||
<head>
|
||
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
|
||
<title></title>
|
||
<link rel="StyleSheet" href="../../default.css">
|
||
</head>
|
||
|
||
<body>
|
||
<H1>Примеры обработки исключений</H1>
|
||
<p><b>Пример 1.</b> Обработка неверного ввода данных.</p>
|
||
<p>Рассмотрим программу. </p>
|
||
<blockquote>
|
||
<p><code><b>var</b> i: integer;<br>
|
||
<b>begin</b><br>
|
||
readln(i);<br>
|
||
writeln(i);<br>
|
||
writeln('Выполнение программы продолжается');<br>
|
||
<b>end</b>.</code></p>
|
||
</blockquote>
|
||
<p>Если при вводе данных произойдет ошибка (например, мы введем
|
||
не число), то программа завершится с ошибкой (ошибка ввода), и последующие
|
||
операторы <code>writeln</code> не будут выполнены.</p>
|
||
<p>Перехватим исключение в блоке <code><b>try</b></code>:</p>
|
||
<blockquote>
|
||
<p><code><b>var</b> i: integer;<br>
|
||
<b>begin</b><br>
|
||
<b>try</b><br>
|
||
readln(i);<br>
|
||
writeln(i);<br>
|
||
<b>except</b><br>
|
||
writeln('Ошибка ввода');<br>
|
||
<b>end</b>;<br>
|
||
writeln('Выполнение программы продолжается');<br>
|
||
<b>end</b>.</code></p>
|
||
</blockquote>
|
||
<p>На этот раз при возникновении ошибки ввода программа не будет
|
||
завершена, а выполнение будет передано в блок <code><b>except</b></code>,
|
||
после чего выполнение программы продолжится дальше. Таким образом, в последней
|
||
программе не выполнится лишь оператор <code>writeln(i)</code>.</p>
|
||
<p>Если в блоке <code><b>try</b></code> могут
|
||
возникнуть различные исключения, то обычно используется вторая форма блока <code>
|
||
<b>except</b></code> с несколькими обработчиками
|
||
исключений. </p>
|
||
<p><b>Пример 2.</b> Обработка различных исключений.</p>
|
||
<blockquote>
|
||
<p><code><b>var</b> a,b: integer;<br>
|
||
assign(f,'a.txt');<br>
|
||
<b>try<br>
|
||
</b> readln(a,b);<br>
|
||
reset(f);<br>
|
||
c:=a <b>div</b> b;<br>
|
||
<b>except</b><br>
|
||
<b>on</b> System.DivideByZeroException <b>do</b><br>
|
||
writeln('Целочисленное деление на 0'); <br>
|
||
<b>on</b> System.IO.IOException <b>do</b><br>
|
||
writeln('Файл отсутствует'); <br>
|
||
<b>end</b>;</code></p>
|
||
</blockquote>
|
||
<p>Часто необходимо совмещать обработку исключений и
|
||
освобождение ресурсов независимо от того, произошло исключение или нет. В этом
|
||
случае используются вложенные операторы <code><b>try</b></code> ... <code>
|
||
<b>except</b></code> и <code><b>try</b></code> ... <code>
|
||
<b>finally</b></code>. </p>
|
||
<p><b>Пример 3.</b> Вложенные операторы <code><b>try</b></code>
|
||
... <code><b>except</b></code> и <code><b>try</b></code>
|
||
... <code><b>finally</b></code>. </p>
|
||
<blockquote>
|
||
<p><code>assign(f,'a.txt');<br>
|
||
<b>try</b><br>
|
||
reset(f);<br>
|
||
<b> try<br>
|
||
try</b><br>
|
||
c:=a <b>div</b> b;<br>
|
||
<b> except</b><br>
|
||
<b> on</b> System.DivideByZeroException <b>do</b><br>
|
||
writeln('Целочисленное деление на 0'); <br><b>
|
||
end</b>;<br>
|
||
<b> finally</b><br>
|
||
close(f);<br>
|
||
<b> end</b>;<br>
|
||
<b>except</b><br>
|
||
<b>on</b> System.IO.IOException <b>do</b><br>
|
||
writeln('Файл отсутствует'); <br>
|
||
<b>end</b>;</code></p>
|
||
</blockquote>
|
||
<p>Обратим внимание, что в данном примере исключение, связанное
|
||
c целочисленным делением на 0, обрабатывается в самом внутреннем
|
||
блоке <code><b>try</b></code>, а исключение, связанное с
|
||
отсутствующим файлом - в самом внешнем. При этом, если файл был открыт, то
|
||
независимо от возникновения исключения деления на 0 он будет закрыт.</p>
|
||
</body>
|
||
|
||
</html> |