Когда ваша программа обнаруживает отказ, который будет препятствовать его завершению, как ожидалось, или будет генерировать ошибочные результаты, вы должны остановить дальнейшее выполнение и сообщить об ошибке, выдав исключение. Основные шаги, которые необходимо предпринять, заключаются в следующем:
Обнаружите ошибку. Часто это делается с помощью некоторого типа условного оператора, такого как if
или try/catch
оператор, который проверяет выход текущей операции.
Создайте MException
объект для представления ошибки. Добавьте идентификатор ошибки и сообщение об ошибке к объекту при вызове конструктора.
Если существуют другие исключения, которые могли привести к текущей ошибке, можно хранить MException
объект для каждого из них в cause
поле одной MException
что ты намереваешься бросить. Используйте addCause
функция для этого.
Если есть исправление, которое можно предложить для текущей ошибки, можно добавить его к Correction
поле MException
что ты намереваешься бросить. Используйте addCorrection
функция для этого.
Используйте 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.