exponenta event banner

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

Обзор

Программное обеспечение 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 одно ключевое слово.

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

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

Также рекомендуется очистить все нежелательные результаты ошибки. Например, закрыть фигуры, которые остались открытыми после ошибки.