Программное обеспечение MATLAB ® по умолчанию завершает работу текущей программы при возникновении исключения. Однако при обнаружении исключения в программе можно получить информацию о том, что пошло не так, и разобраться с ситуацией способом, соответствующим конкретному условию. Для этого требуется try/catch заявление.
Если в коде имеются инструкции, которые могут привести к нежелательным результатам, поместите эти инструкции в try/catch блок, фиксирующий любые ошибки и обрабатывающий их соответствующим образом.
A try/catch выглядит как следующий псевдокод. Состоит из двух частей:
A try блок, включающий все линии между try и catch заявления.
A catch блок, включающий все строки кода между catch и end заявления.
try
Perform one ...
or more operations
A catch ME
Examine error info in exception object ME
Attempt to figure out what went wrong
Either attempt to recover, or clean up and abort
end
B Program continues
Программа выполняет инструкции в try блок. При возникновении ошибки пропускаются все оставшиеся инструкции в try блок и переходит к началу catch блок (показан здесь как точка A). Если все операции в try блок успешно выполнен, затем выполнение пропускает catch полностью и переходит к первой строке, следующей за end оператор (точка B).
Указание try, catch, и end команды, а также код try и catch рекомендуется использовать блоки на отдельных линиях. При объединении любого из этих компонентов в одной строке разделите их запятыми:
try, surf, catch ME, ME.stack, end
ans =
file: 'matlabroot\toolbox\matlab\graph3d\surf.m'
name: 'surf'
line: 49Примечание
Невозможно определить вложенные функции в try или catch блок.
При выполнении код вводит try блокирует и выполняет каждую инструкцию, как если бы она была частью обычной программы. Если ошибок не обнаружено, MATLAB пропускает catch блок полностью и продолжает выполнение после end заявление. Если какой-либо из try операторы отказывают, MATLAB немедленно выходит из try блок, оставляя все оставшиеся инструкции в этом блоке не исполненными, и вводит catch блок.
catch команда отмечает начало catch и предоставляет доступ к структуре данных, которая содержит информацию о том, что вызвало исключение. Это отображается как переменная ME в предыдущем псевдокоде. ME является MException объект. При возникновении исключения MATLAB создает MException и возвращает его в catch оператор, обрабатывающий эту ошибку.
Не требуется указывать какой-либо аргумент с помощью catch заявление. Если вам не нужна информация или методы, предоставленные MException объект, просто укажите catch одно ключевое слово.
MException объект создается внутренним кодом в программе, которая не работает. Объект имеет свойства, содержащие сведения об ошибке, которые могут быть полезны при определении произошедшего и дальнейших действий. MException объект также предоставляет доступ к методам, позволяющим реагировать на исключение.
Войдя в catch блок, MATLAB выполняет операторы последовательно. Эти операторы могут пытаться
Попытка устранить ошибку.
Соберите дополнительные сведения об ошибке.
Включить информацию, найденную в MException возражать и соответствующим образом реагировать.
Очистка среды, оставшейся из-за ошибки кода.
catch блок часто заканчивается rethrow команда. rethrow вызывает выход MATLAB из текущей функции, сохраняя информацию стека вызовов в том виде, в каком она была при первом возникновении исключения. Если эта функция находится на самом высоком уровне, то есть не была вызвана другой функцией, программа прерывается. Если неисправная функция вызвана другой функцией, она возвращается к этой функции. Выполнение программы продолжает возвращаться к функциям более высокого уровня, если только ни один из этих вызовов не был выполнен в рамках более высокого уровня try в этом случае программа выполняет соответствующий блок захвата.
В следующем примере считывается содержимое файла изображения. Она содержит подробные сведения об обработке ошибок и демонстрирует некоторые предлагаемые действия, которые можно предпринять в ответ на ошибку.
Функция считывания изображения выдает и фиксирует ошибки несколькими способами.
Первое if проверяет, вызывается ли функция с входным аргументом. Если входной аргумент не указан, программа выдает ошибку и предлагает входной аргумент для исправления ошибки.
try блокирование попыток открытия и чтения файла. Если происходит сбой открытия или чтения, программа перехватывает результирующее исключение и сохраняет MException объект в переменной ME1.
catch блок проверяет, не удалось ли найти указанный файл. Если это так, программа допускает возможность того, что общий вариант расширения имени файла (например, jpeg вместо jpg) был использован, повторив операцию с измененным расширением. Это делается с помощью try/catch оператор вложен в исходный try/catch.
function d_in = read_image(filename)
% Check the number of input arguments.
if nargin < 1
me = MException('MATLAB:notEnoughInputs','Not enough input arguments.');
aac = matlab.lang.correction.AppendArgumentsCorrection('"image.png"');
me = me.addCorrection(aac);
throw(me);
end
% Attempt to read file and catch an exception if it arises.
try
fid = fopen(filename,'r');
d_in = fread(fid);
catch ME1
% Get last segment of the error identifier.
idSegLast = regexp(ME1.identifier,'(?<=:)\w+$','match');
% Did the read fail because the file could not be found?
if strcmp(idSegLast,'InvalidFid') && ...
~exist(filename,'file')
% Yes. Try modifying the filename extension.
switch ext
case '.jpg' % Change jpg to jpeg
filename = strrep(filename,'.jpg','.jpeg');
case '.jpeg' % Change jpeg to jpg
filename = strrep(filename,'.jpeg','.jpg');
case '.tif' % Change tif to tiff
filename = strrep(filename,'.tif','.tiff');
case '.tiff' % Change tiff to tif
filename = strrep(filename,'.tiff','.tif');
otherwise
fprintf('File %s not found\n',filename);
rethrow(ME1);
end
% Try again, with modified filenames.
try
fid = fopen(filename,'r');
d_in = fread(fid);
catch ME2
fprintf('Unable to access file %s\n',filename);
ME2 = addCause(ME2,ME1);
rethrow(ME2)
end
end
endВ этом примере показаны некоторые действия, которые можно выполнить в ответ на исключение.
Сравните identifier области MException возражает против возможных причин ошибки. В этом случае функция проверяет, заканчивается ли идентификатор на 'InvalidFid', указывающее на то, что файл не найден.
Использование вложенного try/catch чтобы повторить операцию с улучшенным вводом. В этом случае функция повторно выполняет операции открытия и чтения с использованием известного варианта расширения имени файла.
Выведите соответствующее сообщение.
Добавить первый MException объект для cause поле второго.
Добавление предлагаемого исправления к MException объект.
Повторно отмените исключение. Это останавливает выполнение программы и выводит сообщение об ошибке.
Также рекомендуется очистить все нежелательные результаты ошибки. Например, закрыть фигуры, которые остались открытыми после ошибки.