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
объект.
Повторите выдачу исключения. Это останавливает выполнение программы и отображает сообщение об ошибке.
Также целесообразно очистить любые нежелательные результаты ошибки. Для примера закройте цифры, которые оставались открытыми после возникновения ошибки.