То, когда MATLAB® выдает исключение, он получает информацию о причине в структуре данных, вызвало MException
объект. Этот объект является экземпляром MException
MATLAB класс. Можно получить доступ
к MException
объект catching исключение перед вашими прерываниями выполнения программы и доступом к объекту создается для этой конкретной ошибки через catch
команда. При выдаче исключения в ответ на ошибку в собственном коде необходимо будет создать новый MException
возразите и храните информацию об ошибке в том объекте.
В этом разделе описываются MException
класс и объекты создаются из того класса.
Информация о том, как использовать этот класс, представлена в более поздних разделах по, Отвечают на Исключение и Выдают Исключение.
Фигура, показанная ниже, иллюстрирует одну возможную настройку объекта MException
класс. Объект имеет пять свойств: identifier
сообщение
стек
, cause
, и Correction
. Каждое из этих свойств реализовано как поле структуры, которая представляет MException
объект. stack
поле является массивом N-1 дополнительных структур, каждый идентифицирующий функцию и номер строки от стека вызовов. cause
поле является массивом ячеек M-1 MException
объекты, каждый представляющий исключение, которое связано с текущим.
См. Свойства Класса MException для полного описания этих свойств.
Любой код, который обнаруживает ошибку и выдает исключение, должен также создать MException
объект, в котором можно записать и передать информацию об ошибке. Синтаксис MException
конструктор
ME = MException(identifier, message)
где identifier
идентификатор сообщения MATLAB формы
component:mnemonic
это заключено в одинарные кавычки и message
текст, также заключенный в одинарные кавычки, который описывает ошибку. Выход ME
получившийся MException
объект.
Если вы отвечаете на исключение вместо того, чтобы выдать один, вы не должны создавать MException
объект. Объект был уже создан и заполнен кодом, который первоначально обнаружил ошибку.
MException
класс имеет несколько свойств. Каждое из этих свойств реализовано как поле структуры, которая представляет MException
объект. Каждое из этих свойств описано в разделах ниже и сослано в разделах по, Отвечают на Исключение и Выдают Исключение. Все только для чтения; их значения не могут быть изменены.
MException
свойства:
Если вы вызываете surf
функция без входных параметров, MATLAB выдает исключение. Если вы отлавливаете исключение, вы видите свойства MException
структура объекта. (Этот пример использует try/catch
нетипичным способом. Смотрите раздел по Оператору попытки/выгоды для получения дополнительной информации об использовании try/catch
).
try surf catch ME ME end
Запустите это в командной строке, и MATLAB возвращает содержимое MException
объект:
ME = MException with properties: identifier: 'MATLAB:narginchk:notEnoughInputs' message: 'Not enough input arguments.' cause: {} stack: [1×1 struct] Correction: []
stack
поле показывает имя файла, функцию и номер строки, где исключение было выдано:
ME.stack
ans =
file: 'matlabroot\toolbox\matlab\graph3d\surf.m'
name: 'surf'
line: 54
cause
и Correction
поля пусты в этом случае. Каждое поле описано более подробно в разделах, которые следуют.
Идентификатор сообщения является тегом, который вы присоединяете к ошибке или предупреждению оператора, что совершает ту ошибку или предупреждение исключительно распознаваемого MATLAB. Можно использовать идентификаторы сообщений с сообщением об ошибке, чтобы лучше идентифицировать источник ошибки, или с предупреждениями управлять любым выбранным подмножеством предупреждений в программах.
Идентификатор сообщения является вектором символов только для чтения, который задает component и метку mnemonic для ошибки или предупреждения. Формат простого идентификатора
component:mnemonic
Двоеточие разделяет две части идентификатора: component
и mnemonic
. Если идентификатор использует больше чем один component
, затем дополнительные двоеточия требуются, чтобы разделять их. Идентификатор сообщения должен всегда содержать по крайней мере одно двоеточие.
Некоторые примеры идентификаторов сообщений
MATLAB:rmpath:DirNotFound MATLAB:odearguments:InconsistentDataType Simulink:actionNotTaken TechCorp:OpenFile:notFoundInPath
Оба component
и mnemonic
поля должны придерживаться следующих синтаксических правил:
Никакой пробел (пробелы или символы табуляции) не позволен нигде в идентификаторе.
Первый символ должен быть алфавитным, или прописным или строчным.
Оставшиеся символы могут быть алфавитно-цифровыми или подчеркивание.
Нет никакого ограничения длины ни одному component
или mnemonic
. Идентификатор может также быть пустым символьным вектором.
Поле компонента. component
поле задает широкую категорию, под которой могут быть сгенерированы различные ошибки и предупреждения. Общие компоненты являются конкретным продуктом или именем тулбокса, таким как MATLAB
или Control
, или возможно имя вашей компании, такой как TechCorp
в предыдущем примере.
Можно также использовать это поле, чтобы задать многоуровневый компонент. Следующий оператор имеет трехуровневый компонент, сопровождаемый мнемонической меткой:
TechCorp:TestEquipDiv:Waveform:obsoleteSyntax
Поле компонента позволяет вам гарантировать уникальность каждого идентификатора. Таким образом, в то время как внутренний код MATLAB может использовать определенный идентификатор предупреждения как MATLAB:InconsistentDataType
, это не устраняет вас от использования той же мнемосхемы, пока вы предшествуете ему с уникальным компонентом. Например,
warning('TechCorp:InconsistentDataType', ... 'Value %s is inconsistent with existing properties.' ... sprocketDiam)
Мнемоническое поле. mnemonic
поле обычно используется в качестве тега, относящегося к конкретному сообщению. Например, при создании отчетов об ошибке, следующей из использования неоднозначного синтаксиса, простой компонент и мнемосхема, такая как следующее могут быть соответствующими:
MATLAB:ambiguousSyntax
Идентификаторы сообщений в Объекте MException. При выдаче исключения создайте соответствующий идентификатор и сохраните его в MException
объект в то время, когда вы создаете объект с помощью синтаксиса
ME = MException(identifier, text)
Например,
ME = MException('AcctError:NoClient', ... 'Client name not recognized.'); ME.identifier ans = AcctError:NoClient
При ответе на исключение можно извлечь идентификатор сообщения из MException
возразите как показано здесь. Используя surf
пример снова,
try surf catch ME id = ME.identifier end id = MATLAB:narginchk:notEnoughInputs
Сообщение об ошибке в MATLAB является вектором символов только для чтения, выпущенным кодом программы, и возвратилось в MException
объект. Это сообщение может помочь пользователю в определении причины, и возможно средства, отказа.
При выдаче исключения сочините соответствующее сообщение об ошибке и сохраните его в MException
объект в то время, когда вы создаете объект с помощью синтаксиса
ME = MException(identifier, text)
Если ваше сообщение требует спецификаций форматирования, как доступные с sprintf
функция, используйте этот синтаксис в MException
конструктор:
ME = MException(identifier, formatstring, arg1, arg2, ...)
Например,
S = 'Accounts'; f1 = 'ClientName'; ME = MException('AcctError:Incomplete', ... 'Field ''%s.%s'' is not defined.', S, f1); ME.message ans = Field 'Accounts.ClientName' is not defined.
При ответе на исключение можно извлечь сообщение об ошибке из MException
объект можно следующим образом:
try surf catch ME msg = ME.message end msg = Not enough input arguments.
stack
поле MException
объект идентифицирует номер строки, функцию и имя файла, где ошибка была обнаружена. Если ошибка происходит в вызванной функции, как в следующем примере, stack
поле содержит номер строки, имя функции и имя файла не только для местоположения мгновенной ошибки, но также и для каждой из функций вызова. В этом случае, stack
массив N-1, где N представляет глубину стека вызовов. Таким образом, поле стека отображает имя функции и номер строки, где исключение произошло, имя и номер строки вызывающей стороны, вызывающей стороны вызывающей стороны, и т.д., пока самая верхняя функция не достигнута.
При выдаче исключения MATLAB хранит информацию стека вызовов в stack
поле . Вы не можете записать в это поле; доступ только для чтения.
Например, предположите, что у вас есть три функции, которые находятся в двух отдельных файлах:
mfileA.m ========================= . . 42 function A1(x, y) 43 B1(x, y); mfileB.m ========================= . . 8 function B1(x, y) 9 B2(x, y) . . 26 function B2(x, y) 27 . 28 . 29 . 30 . 31 % Throw exception here
Отловите исключение в переменной ME
и затем исследуйте stack
поле :
for k=1:length(ME.stack) ME.stack(k) end ans = file: 'C:\matlab\test\mfileB.m' name: 'B2' line: 31 ans = file: 'C:\matlab\test\mfileB.m' name: 'B1' line: 9 ans = file: 'C:\matlab\test\mfileA.m' name: 'A1' line: 43
В некоторых ситуациях может быть важно записать информацию о не только одна команда, которая заставила выполнение останавливаться, но также и другие исключения, которые отловил ваш код. Можно сохранить их дополнительный MException
объекты в cause
поле первичного исключения.
cause
поле MException
дополнительный массив ячеек связанного MException
объекты. Необходимо использовать следующий синтаксис при добавлении объектов в cause
cellArray:
primaryException = addCause(primaryException, secondaryException)
Этот пример пытается присвоить массив D
к переменной X
. Если D
массив не существует, код пытается загрузить его из MAT-файла и затем повторяет присвоение его к X
. Если загрузка перестала работать, новый MException
объект (ME3
) создается, чтобы сохранить причину первых двух ошибок (ME1
и ME2
):
try X = D(1:25) catch ME1 try filename = 'test200'; load(filename); X = D(1:25) catch ME2 ME3 = MException('MATLAB:LoadErr', ... 'Unable to load from file %s', filename); ME3 = addCause(ME3, ME1); ME3 = addCause(ME3, ME2); end end
Существует два исключения в поле причины ME3
:
ME3.cause ans = [1x1 MException] [1x1 MException]
Исследуйте cause
поле ME3
видеть связанные ошибки:
ME3.cause{:} ans = MException object with properties: identifier: 'MATLAB:UndefinedFunction' message: 'Undefined function or method 'D' for input arguments of type 'double'.' stack: [0x1 struct] cause: {} ans = MException object with properties: identifier: 'MATLAB:load:couldNotReadFile' message: 'Unable to read file test204: No such file or directory.' stack: [0x1 struct] cause: {}
Некоторые исключения могут иметь фиксацию, которая может быть предложена, когда исключение происходит. Если вы выдаете исключение, можно предложить фиксацию путем создания matlab.lang.correction.AppendArgumentsCorrection
, matlab.lang.correction.ConvertToFunctionNotationCorrection
, или matlab.lang.correction.ReplaceIdentifierCorrection
объект и добавление его к Correction
поле исключения.
Необходимо использовать следующий синтаксис при добавлении фиксации в Correction
поле :
primaryException = addCorrection(baseException, exceptionCorrection)
Этот пример создает функциональный hello
это требует одного входного параметра. Если функция вызвана без входных параметров, MATLAB производит ошибку и предлагает входной параметр "world"
как фиксация.
function hello(audience) if nargin < 1 me = MException('MATLAB:notEnoughInputs', 'Not enough input arguments.'); aac = matlab.lang.correction.AppendArgumentsCorrection('"world"'); me = addCorrection(me, aac); throw(me) end fprintf("Hello, %s!\n", audience) end
Когда вы вызываете функцию без аргумента, MATLAB предлагает фиксацию.
hello
Error using hello (line 6)
Not enough input arguments.
Did you mean:
>> hello("world")
Существует несколько методов, которые можно использовать с MException
класс. Имена этих методов являются чувствительными к регистру. Смотрите страницы с описанием функции MATLAB для получения дополнительной информации.
MethodName | Описание |
---|---|
addCause | Добавьте MException к cause поле другого MException . |
addCorrection | Обеспечьте предложенное исправление для текущего исключения. |
getReport | Возвратите форматированное сообщение на основе текущего исключения. |
MException.last | Возвратите последнее неперехваченное исключение. Это - статический метод. |
rethrow | Переиздайте исключение, которое было ранее отловлено. |
throw | Выпустите исключение. |
throwAsCaller | Выпустите исключение, но не используйте текущий стековый фрейм от stack поле . |