MException

Захват информации об ошибке

Описание

Любой MATLAB® код, который обнаруживает ошибку и выдает исключение, создает MException объект. The MException объект содержит доступную для извлечения информацию об ошибках. MATLAB может выдавать либо предопределенные исключения, либо исключения, которые вы создаете.

Создание

Описание

пример

ME = MException(errID,msgtext) собирает информацию о определенной ошибке и хранит ее в MException ME объекта. The MException объект построен с идентификатором ошибки errID и сообщение об ошибке msgtext.

пример

ME = MException(errID,msgtext,A1,...,An) позволяет форматировать сообщение об ошибке с помощью текстовых или числовых значений A1,...,An для замены спецификаторов преобразования в msgtext во время исполнения.

Входные параметры

расширить все

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

Идентификатор ошибки включает одно или несколько полей компонента и мнемоническое поле. Поля должны быть разделены двоеточием. Например, идентификатор ошибки с полем компонента component и мнемоническое поле mnemonic задается как 'component:mnemonic'.

  • Поле компонента обычно задает продукт или функциональность, при которых могут быть сгенерированы различные ошибки. Для примера, идентификатор ошибки 'MATLAB:TooManyInputs' имеет поле компонента MATLAB, что означает, что исключение выдается в MATLAB. Можно повторно использовать ту же мнемоническую TooManyInputs пока вы предшествуете ему с различными компонентами. Например, если вы хотите выдать исключение в вашем тулбоксе всякий раз, когда функция вызывается с слишком большим количеством входов, можно использовать 'MyToolbox:TooManyInputs'.

  • Мнемоническое поле идентификатора ошибки обычно является тегом, характерным для проблемы ошибки. Например, при сообщении об ошибке, вызванной использованием неоднозначного синтаксиса в MATLAB, можно задать идентификатор ошибки следующим 'MATLAB:ambiguousSyntax'.

Каждый компонент и мнемонические поля должны начинаться с буквы. Остальные символы могут быть алфавитно-цифровыми (A-Z, a-z, 0-9) и подчеркивающими. Никакие пробелы, в символы не могут появиться errID.

Пример: 'MyComponent:noSuchVariable'

Пример: 'Simulink:Signals:InvalidNumberOfPorts'

Сведения о причине ошибки и о том, как ее можно исправить, заданные как вектор символов или строковый скаляр. Для форматирования текста используйте escape-последовательности, такие как \t или \n. Вы также можете использовать любые спецификаторы формата, поддерживаемые sprintf функции, такие как %s или %d. Задайте значения для спецификаторов преобразования используя A1,...,An входные параметры.

Пример: 'Error opening file.'

Пример: 'Error on line %d.'

Значения, которые заменяют спецификаторы преобразования в msgtext, каждый задан как вектор символов, строковый скаляр или числовой скаляр.

Свойства

расширить все

Это свойство доступно только для чтения.

Вектор символов, который однозначно идентифицирует ошибку, заданную в качестве вектора символов errID входной параметр.

Пример: 'MATLAB:test'

Это свойство доступно только для чтения.

Вектор символов, который содержит сообщение об ошибке, отображаемое при выдаче MATLAB исключения, заданного msgtext и A1,...,An входные параметры.

Пример: 'Variable x not found'

Это свойство доступно только для чтения.

Массив структур, который содержит информацию трассировки стека, включая имя файла (file), имя функции (name) и номер линии (line), где MATLAB выдает исключение. Если ошибка возникает в вызываемой функции, stack свойство также содержит имя файла, имя функции и номер линии для каждой из вызываемых функций. MATLAB генерирует стек только тогда, когда выдает исключение.

stack является N -by-1 struct массив, где N представляет глубину стека вызовов.

Это свойство доступно только для чтения.

Массив ячеек MException объекты, которые заставили MATLAB создать исключение. Используйте addCause метод для добавления исключения в cause свойство.

Это свойство доступно только для чтения.

Предлагаемое исправление для исключения, заданное как matlab.lang.correction.AppendArgumentsCorrection, matlab.lang.correction.ConvertToFunctionNotationCorrection, или matlab.lang.correction.ReplaceIdentifierCorrection объект. Когда выдается исключение и оно не захватывается, MATLAB использует Correction свойство, предлагающее исправление для исключения.

Функции объекта

throwВыдать исключение
MException.lastВозврат последнего неоткрытого исключения
rethrowПеревернуть ранее захваченное исключение
throwAsCallerВыдать исключение, как будто происходит внутри вызывающей функции
addCauseЗапись дополнительных причин исключения
addCorrectionПредоставьте рекомендуемое исправление для исключения
getReportПолучите сообщение об ошибке для исключения

Примеры

свернуть все

Создайте MException объект для захвата информации об ошибке входа.

errID = 'myComponent:inputError';
msgtext = 'Input does not have the expected format.';

ME = MException(errID,msgtext)
ME = 
  MException with properties:

    identifier: 'myComponent:inputError'
       message: 'Input does not have the expected format.'
         cause: {}
         stack: [0x1 struct]
    Correction: []

Используйте оба msgtext и A1,...,An входные параметры для создания сообщения об ошибке.

errID = 'MATLAB:test';
msgtext = 'There are %d errors on this page';
A1 = 10;

ME = MException(errID,msgtext,A1)
ME = 
  MException with properties:

    identifier: 'MATLAB:test'
       message: 'There are 10 errors on this page'
         cause: {}
         stack: [0x1 struct]
    Correction: []

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

str = input('Type a variable name: ','s');
if ~exist(str,'var')
    ME = MException('MyComponent:noSuchVariable', ...
        'Variable %s not found',str);
    throw(ME)
end

По запросу входа введите любую переменную, которая не существует в вашей рабочей области. Для примера введите notaVariable.

Variable notaVariable not found

Начиная с notVariable не существует в вашей рабочей области, MATLAB создает и выдает MException объект.

Использовать try, catch для доступа к информации, захваченной в MException объект.

Создайте файл myfile.m который содержит вызов на surf функция без входов. (Этот вызов функции приводит к исключению и предназначен для иллюстративных целей.) Поймайте исключение, которое MATLAB выдает в MException ME объекта, и отобразить сообщение об ошибке путем доступа к message свойство ME.

try
    surf
catch ME
    disp('Error Message:')
    disp(ME.message)
end
Error Message:
Not enough input arguments.

Извлеките идентификатор ошибки.

ME.identifier
ans =

    'MATLAB:narginchk:notEnoughInputs'

Запрос содержимого stack свойство. В этом примере стек вызовов представлен как массив структур 2 на 1.

for i = 1:numel(ME.stack)
    ME.stack(i)
end
ans = 

  struct with fields:

    file: 'matlabroot\toolbox\matlab\graph3d\surf.m'
    name: 'surf'
    line: 49


ans = 

  struct with fields:

    file: 'c:\myMATLABfiles\myfile.m'
    name: 'myfile'
    line: 2

Первый элемент stack отображает имя файла (surf.m), имя функции (surf) и номер линии (49), где произошло исключение. Второй элемент stack показывает имя и номер линии, в которых произошло исключение в скрипте вызывающего абонента.

Перехватите исключение, сгенерированное вызовом несуществующей функции, notaFunction. Если функция не определена, выдайте предупреждение и присвойте выходу значение 0.

try
    a = notaFunction(5,6);
catch ME
    if strcmp(ME.identifier,'MATLAB:UndefinedFunction')
        warning('Function is undefined.  Assigning a value of 0.');
    else
        rethrow(ME)
    end
end
Warning: Function is undefined.  Assigning a value of 0. 

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

Введенный в R2007b