exponenta event banner

MException

Сбор информации об ошибках

Описание

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

Создание

Описание

пример

ME = MException(errID,msgtext) фиксирует информацию об определенной ошибке и сохраняет ее в MException объект ME. 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'

Сведения о причине ошибки и о том, как ее можно исправить, указанные как вектор символа или скаляр строки. Для форматирования текста используйте переходные последовательности, такие как \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