Ответ на исключение

Обзор

MATLAB® по умолчанию программа завершает выполнение текущей программы при выдаче исключения. Однако, если вы поймаете исключение в своей программе, можно получить информацию о том, что пошло не так, и справиться с ситуацией таким образом, который подходит для конкретного условия. Для этого требуется try/catch оператор.

Оператор 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

При выполнении ваш код входит в try блокирует и выполняет каждый оператора так, как если бы она была частью обычной программы. Если ошибок не обнаружено, MATLAB пропускает catch полностью блокировать и продолжить выполнение после end оператор. Если какой-либо из try операторы, MATLAB немедленно выходят из try блокирует, оставляя оставшиеся операторы в этом блоке невыполненными, и входит в catch блок.

Блок 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 объект.

  • Повторите выдачу исключения. Это останавливает выполнение программы и отображает сообщение об ошибке.

Также целесообразно очистить любые нежелательные результаты ошибки. Для примера закройте цифры, которые оставались открытыми после возникновения ошибки.