Обработка ошибок
Вывод сообщений об ошибках
Часто в ходе вычислений возникают ошибки. Например, мы уже сталкивались с проблемой вычисления функции sin(x)/x – при х = 0 имеет место ошибка вида "деление на ноль". При появлении ошибки вычисления могут завершиться досрочно с выводом сообщения об ошибке. Следует, однако, отметить, что не все ошибки вызывают остановку вычислений. Некоторые сопровождаются только выдачей предупреждающей надписи.
Такие ситуации должны учитываться программистом, отмечаться как ошибочные и по возможности устраняться. Для вывода сообщения об ошибке служит команда error('Сообщение об ошибке'), при выполнении которой вычисления прерываются и выдается сообщение об ошибке, заданное в апострофах. Ниже дан пример вычисления функции sd(x)=sin(x)/x, в котором задано сообщение об ошибке на русском языке:
function
f
=
sd(x)
if
x
=
=
0
error(
'Ошибка - деление на 0'
).
end
f
=
sin(x)
/
x
Для выявления ситуации об ошибке использован оператор условного перехода if, который будет описан детально несколько позднее. Результат выполнения данной функции приводится ниже:
>
>
sd(
1
)
f
=
0.8415
ans
=
0.8415
>
>
sd(
0
)
??? Error using
=
>
sd Ошибка
-
деление на
0
Если остановка программы при появлении ошибки нежелательна, то может использоваться команда вывода предупреждающего сообщения warning('Предупреждающее сообщение').
Эта команда выводит стоящее в апострофах сообщение, но не препятствует дальнейшей работе программы. Признаком того, что является ошибкой, а что – предупреждением, являются символы ??? и слово Warning в соответствующих сообщениях.
Функция lasterr и обработка ошибок
Опытные программисты должны предусматривать ситуации с появлением ошибок. К примеру, при х = 0 выражение sin(x)/x = 0/0 = 1 и правильным решением было бы вместо его вычисления использовать значение 1.
В данном простом примере приводится функция sd0, исключающая вычисление sin(x)/x при х = 0:
function
f
=
sd0(x)
if
x
=
=
0
f
=
1
;
else
f
=
sin(x)
/
x;
end
return
При этом вычисления пройдут корректно при любом х:
>
>
sd0(
1
)
ans
=
0.8415
>
>
sd0(
0
)
ans
=
1
Для вывода сообщения о последней произошедшей ошибке служит функция lasterr (см. пример ниже):
>
>
aaa
??? Undefined
function
or variable
'aaa'
.
>
>
2
+
3
ans
=
5
>
>
1
/
0
Warning: Divide by zero,
ans
=
Inf
>
>
lasterr
ans
=
Undefined
function
or variable
'aaa'
.
Как нетрудно заметить, функция lasterr возвращает текстовое сообщение, следующее за знаками ??? сообщения об ошибке.
В общем случае программы могут содержать обработчики ошибок, направляющие ход вычислений в нужное русло, даже если появляется ошибка. Но для этого требуются средства индикации и обработки ошибок. Основными из них являются функции eval и lasterr. О функции lasterr уже говорилось, а функция eval (' try', 'catch') в отличие от ранее рассмотренной формы (урок 18) имеет два входных аргумента. Один из них – это строчное выражение, которое преобразуется в исполняемую форму и выполняется при отсутствии ошибки. Если же происходит ошибка, то строка 'catch' вызывает обращение к функции обработки ошибки.