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

Обзор

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: 54

Примечание

Вы не можете задать вложенные функции в блоке try или catch.

Блок попытки

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

Блок выгоды

Команда catch отмечает запуск блока catch и обеспечивает доступ к структуре данных, которая содержит информацию о том, что вызвало исключение. Это показывают как переменный ME в предыдущем псевдокоде. Эта структура данных является объектом класса MException MATLAB. Когда исключение происходит, MATLAB создает экземпляр этого класса и возвращает его в операторе catch, который обрабатывает ту ошибку.

Вы не обязаны задавать любой аргумент с оператором catch. Если вам не нужна ни одна информация, или методы, предоставленные объектом MException, просто задайте одно только ключевое слово catch.

Объект MException создается внутренним кодом в программе, которая перестала работать. Объект имеет свойства, которые содержат информацию об ошибке, которая может быть полезной в определении, что произошло и как продолжить. Объект MException также обеспечивает доступ к методам, которые позволяют вам ответить на исключение. Смотрите раздел по Классу MException, чтобы узнать больше о классе MException.

Введя блок catch, MATLAB выполняет операторы в последовательности. Эти операторы могут попытаться

  • Попытайтесь разрешить ошибку.

  • Получите больше информации об ошибке.

  • Включите информацию, найденную в объекте MException, и ответьте соответственно.

  • Очистите среду, которую оставил провальный код.

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

Больше информации о классе MException предоставляется в разделе Capture Information About Exceptions.

Предложения о том, как обработать исключение

Следующий пример читает содержимое файла изображения. Блок try пытается открыть и считать файл. Если или открытые сбои или сбои чтения, программа отлавливает получившееся исключение и сохраняет объект MException в переменном ME1.

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

function d_in = read_image(filename)
[path name ext] = fileparts(filename);
try
   fid = fopen(filename, 'r'); 
   d_in = fread(fid); 
catch ME1 
   % Get last segment of the error message 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 против возможных причин ошибки.

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

  • Отобразите соответствующее сообщение в случае, что файл действительно не существует и затем повторно выдает исключение.

  • Добавьте первый объект MException к полю cause второго.

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

Очистка любых нежелательных результатов ошибки также желательна. Например, ваша программа, возможно, выделила существенное количество памяти, в которой она больше не нуждается.

Была ли эта тема полезной?