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

Обзор

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

Оператор попытки/выгоды

Когда у вас есть операторы в вашем коде, который мог сгенерировать нежелательные результаты, поместить те операторы в try/catch блокируйтесь, который фиксирует любые ошибки и обрабатывает их соответственно.

try/catch оператор смотрит что-то как следующий псевдокод. Это состоит из двух частей:

  • try блокируйтесь, который включает все линии между try и catch операторы.

  • 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

Примечание

Вы не можете задать вложенные функции в a 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 блок часто заканчивается a 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 объект.

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

Чистка любых нежелательных результатов ошибки также желательна. Например, близко фигуры, которые остались открытыми после того, как ошибка произошла.