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