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 только ключевое слово.
The MException объект создается внутренним кодом в программе, которая терпит неудачу. Объект имеет свойства, которые содержат информацию об ошибке, которая может быть полезна при определении того, что произошло и как продолжить. The MException объект также предоставляет доступ к методам, которые позволяют вам реагировать на исключение.
Вступив в catch блок, MATLAB выполняет операторы последовательно. Эти операторы могут попытаться
Попытка разрешить ошибку.
Получите дополнительные сведения об ошибке.
Включите информацию, найденную в MException возражать и реагировать соответствующим образом.
Очистите окружение, оставленную непройденным кодом.
The catch блок часто заканчивается на rethrow команда. rethrow приводит к тому, что MATLAB выходит из текущей функции, сохраняя информацию о стеке вызовов в том виде, в каком она была при первом выдаче исключения. Если эта функция находится на самом высоком уровне, то есть она не вызывалась другой функцией, программа прекращает работу. Если отказавшая функция была вызвана другой функцией, она возвращается к этой функции. Выполнение программы продолжает возвращаться к функциям более высокого уровня, если ни один из этих вызовов не был выполнен в рамках try более высокого уровня блок, в этом случае программа выполняет соответствующий блок catch.
В следующем примере считывается содержимое файла изображения. Он включает подробную обработку ошибок и демонстрирует некоторые предлагаемые действия, которые можно предпринять в ответ на ошибку.
Функция чтения изображений выдает и улавливает ошибки несколькими способами.
Первое if оператор проверяет, вызывается ли функция с входным параметром. Если входной параметр не задан, программа выдает ошибку и предлагает входному параметру исправить ошибку.
try блок пытается открыть и считать файл. Если либо открытие, либо чтение не удается, программа ловит получившееся исключение и сохраняет MException объект в переменной ME1.
The 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 объект.
Повторите выдачу исключения. Это останавливает выполнение программы и отображает сообщение об ошибке.
Также целесообразно очистить любые нежелательные результаты ошибки. Для примера закройте цифры, которые оставались открытыми после возникновения ошибки.