Выдать исключение

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

  1. Обнаружите ошибку. Часто это делается с помощью некоторого типа условного оператора, такого как if или try/catch оператор, который проверяет выход текущей операции.

  2. Создайте MException объект для представления ошибки. Добавьте идентификатор ошибки и сообщение об ошибке к объекту при вызове конструктора.

  3. Если существуют другие исключения, которые могли привести к текущей ошибке, можно хранить MException объект для каждого из них в cause поле одной MException что ты намереваешься бросить. Используйте addCause функция для этого.

  4. Если есть исправление, которое можно предложить для текущей ошибки, можно добавить его к Correction поле MException что ты намереваешься бросить. Используйте addCorrection функция для этого.

  5. Используйте throw или throwAsCaller функция, чтобы иметь MATLAB® выдать исключение. На данной точке MATLAB сохраняет информацию о стеке вызовов в stack поле MException, выходит из текущей выполняемой функции и возвращает управление клавиатуре или входному блоку catch в вызов функции.

Предложения по выдаче исключения

Этот пример иллюстрирует выдачу исключения, используя только что описанные шаги.

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

function indexIntoArray(A,idx)

% 1) Detect the error.
try
    A(idx)
catch
    
    % 2) Construct an MException object to represent the error.
    errID = 'MYFUN:BadIndex';
    msg = 'Unable to index into array.';
    baseException = MException(errID,msg);
    
    % 3) Store any information contributing to the error. 
    if nargin < 2 
        causeException = MException('MATLAB:notEnoughInputs','Not enough input arguments.');
        baseException = addCause(baseException,causeException);
        
        % 4) Suggest a correction, if possible.
        if(nargin > 1) 
            exceptionCorrection = matlab.lang.correction.AppendArgumentsCorrection('1');
            baseException = baseException.addCorrection(exceptionCorrection);
        end
        
        throw(baseException);
    end
        
    try
        assert(isnumeric(idx),'MYFUN:notNumeric', ...
            'Indexing array is not numeric.')
    catch causeException
        baseException = addCause(baseException,causeException);
    end
    
    if any(size(idx) > size(A))
        errID = 'MYFUN:incorrectSize';
        msg = 'Indexing array is too large.';
        causeException2 = MException(errID,msg);
        baseException = addCause(baseException,causeException2);
    end
    
    % 5) Throw the exception to stop execution and display an error
    % message.
    throw(baseException)
end
end

Если вы вызываете функцию, не задавая индекс, функция выдает подробную ошибку и предлагает коррекцию:

A = [13 42; 7 20];
indexIntoArray(A)
Error using indexIntoArray (line 21)
Unable to index into array.

Caused by:
    Not enough input arguments.
 
Did you mean:
>> indexIntoArray(A, 1)

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

A = [13 42; 7 20];
idx = ['a' 'b' 'c'];
indexIntoArray(A, idx)
Error using indexIntoArray (line 41)
Unable to index into array.

Caused by:
    Error using indexIntoArray (line 25)
    Indexing array is not numeric.
    Indexing array is too large.