То, когда MATLAB® выдает исключение, он получает информацию о причине в структуре данных, вызвало объект MException
. Этот объект является экземпляром класса MException
MATLAB. Можно получить доступ к объекту MException
catching исключение перед прерываниями выполнения программы и доступом к объекту, созданному для этой конкретной ошибки через команду catch
. При выдаче исключения в ответ на ошибку в собственном коде необходимо будет создать новый объект MException
и хранить информацию об ошибке в том объекте.
В этом разделе описываются класс MException
и объекты, созданные из того класса.
Информация о том, как использовать этот класс, представлена в более поздних разделах по, Отвечают на Исключение и Выдают Исключение.
Фигура, показанная ниже, иллюстрирует одну возможную настройку объекта класса MException
. Объект имеет пять свойств: identifier
, message
, stack
, 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
:
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
и добавления его в поле 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 = me.addCorrection(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 . |