exponenta event banner

Создать исключение

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

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

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

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

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

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

Рекомендации по созданию исключения

В этом примере показано создание исключения с использованием только что описанных шагов.

Создайте функцию, 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.