MException
捕获错误信息
说明
检测到错误并抛出异常的任何 MATLAB® 代码都构造一个 MException
对象。该 MException
对象包含有关错误的可检索信息。MATLAB 可以抛出预定义异常或您构造的异常。
创建对象
描述
输入参数
errID
— 错误标识符
字符向量 | 字符串标量
错误标识符,指定为字符向量或字符串标量。将错误标识符用于异常处理可以更好地识别错误来源或控制在程序中选择的异常子集。
错误标识符包括一个或多个组件字段和一个助记键字段。各字段必须用冒号分隔。例如,具有组件字段 component
和助记键字段 mnemonic
的错误标识符指定为 'component:mnemonic'
。
组件字段通常指定可能出现各种错误的产品或功能。例如,错误标识符
'MATLAB:TooManyInputs'
有组件字段MATLAB
,这意味着在 MATLAB 中抛出异常。您可以重用同一个助记键TooManyInputs
,只要您在它前面加上不同组件即可。例如,如果您想要每当调用函数时使用过多的输入就在工具箱中抛出异常,您可以使用'MyToolbox:TooManyInputs'
。错误标识符的助记键字段通常是特定于错误问题的标记。例如,当报告由于在 MATLAB 中使用模糊语法而导致的错误时,您可以将错误标识符指定为
'MATLAB:ambiguousSyntax'
。
组件字段和助记键字段都必须以字母开头。其余字符可以是字母数字字符(A–Z、a–z、0–9)和下划线。errID
中不能出现空白字符。
示例: 'MyComponent:noSuchVariable'
示例: 'Simulink:Signals:InvalidNumberOfPorts'
msg
— 有关错误原因的信息
字符向量 | 字符串标量
有关错误原因以及如何进行更正的信息,指定为字符向量或字符串标量。要设置文本格式,请使用转义序列,例如 \t
或 \n
。还可以使用 sprintf
函数支持的任何格式设定符,例如 %s
或 %d
。使用 A
输入参数指定转换设定符的值。
示例: 'Error opening file.'
示例: 'Error on line %d.'
A
— 替换值
字符向量 | 字符串标量 | 数值标量
用来替换 msg
中的转换设定符的值,指定为字符向量、字符串标量或数值标量。
属性
identifier
— 错误的唯一标识符
字符向量
此 属性 为只读。
唯一标识错误的字符向量,由 errID
输入参数指定为字符向量。
示例: 'MATLAB:test'
message
— 错误消息
字符向量
此 属性 为只读。
包含在 MATLAB 引发异常时显示的错误消息的字符向量,由 msg
和 A
输入参数指定。
示例: 'Variable x not found'
stack
— 堆栈跟踪信息
结构体数组
此 属性 为只读。
包含堆栈跟踪信息的结构体数组,其中包含文件名 (file
)、函数名称 (name
) 和 MATLAB 引发异常的行号 (line
)。如果调用的函数中发生错误,则 stack
属性还包含文件名、函数名称以及所调用的每个函数的行号。MATLAB 仅在它引发异常时生成堆栈。
stack
是一个 N×1 struct
数组,其中 N 表示调用堆栈的深度。
cause
— 异常的原因
MException
对象构成的元胞数组
此 属性 为只读。
导致 MATLAB 产生异常的 MException
对象的元胞数组。使用 addCause
方法将异常添加到 cause
属性。
Correction
— 对异常的建议修复
matlab.lang.correction.AppendArgumentsCorrection
对象 | matlab.lang.correction.ConvertToFunctionNotationCorrection
对象 | matlab.lang.correction.ReplaceIdentifierCorrection
对象
此 属性 为只读。
对异常的建议修复,指定为 matlab.lang.correction.AppendArgumentsCorrection
、matlab.lang.correction.ConvertToFunctionNotationCorrection
或 matlab.lang.correction.ReplaceIdentifierCorrection
对象。当引发异常但未将其捕获时,MATLAB 使用 Correction
属性来提供该异常的修复建议。
对象函数
throw | 引发异常 |
MException.last | 返回最后未捕获的异常 |
rethrow | 重新引发以前捕获的异常 |
throwAsCaller | 引发异常,如同发生在调用函数内 |
addCause | 记录异常的其他原因 |
addCorrection | 提供异常的建议修复 |
getReport | 获取异常的错误消息 |
示例
创建 MException 对象
创建 MException
对象来捕获关于输入错误的信息。
errID = 'myComponent:inputError'; msgtext = 'Input does not have the expected format.'; ME = MException(errID,msgtext)
ME = MException with properties: identifier: 'myComponent:inputError' message: 'Input does not have the expected format.' cause: {} stack: [0x1 struct] Correction: []
创建包含格式化错误消息的 MException
同时使用 msgtext
和 A1,...,An
输入参数来创建错误消息。
errID = 'MATLAB:test'; msgtext = 'There are %d errors on this page'; A1 = 10; ME = MException(errID,msgtext,A1)
ME = MException with properties: identifier: 'MATLAB:test' message: 'There are 10 errors on this page' cause: {} stack: [0x1 struct] Correction: []
创建并引发 MException 对象
如果工作区中没有输入变量名称,则会引发异常。
str = input('Type a variable name: ','s'); if ~exist(str,'var') ME = MException('MyComponent:noSuchVariable', ... 'Variable %s not found',str); throw(ME) end
在命令提示符处,输入工作区中不存在的任何变量。例如,输入 notaVariable
。
Variable notaVariable not found
由于 notVariable
不在您的工作区中,MATLAB 会创建并抛出一个 MException
对象。
访问 MException 对象中的信息
使用 try, catch
访问在 MException
对象中捕获的信息。
创建文件 myfile.m
,其中包含对 surf
函数的不带输入的调用。(此函数调用会导致异常,用于演示目的。)捕获 MATLAB 在 MException
对象 ME
中抛出的异常,并通过访问 ME
的 message
属性来显示错误消息。
try surf catch ME disp('Error Message:') disp(ME.message) end
Error Message: Not enough input arguments.
提取错误标识符。
ME.identifier
ans = 'MATLAB:narginchk:notEnoughInputs'
查询 stack
属性的内容。在此示例中,调用堆栈表示为一个 2×1 结构体数组。
for i = 1:numel(ME.stack) ME.stack(i) end
ans = struct with fields: file: 'matlabroot\toolbox\matlab\graph3d\surf.m' name: 'surf' line: 49 ans = struct with fields: file: 'c:\myMATLABfiles\myfile.m' name: 'myfile' line: 2
stack
的第一个元素显示发生异常的文件名 (surf.m
)、函数名称 (surf
) 和行号 (49
)。stack
的第二个元素显示调用脚本中出现异常的名称和行号。
响应抛出的异常
捕获通过调用不存在的函数 notaFunction
生成的异常。如果该函数未定义,会发出警告并为输出赋值 0。
try a = notaFunction(5,6); catch ME if strcmp(ME.identifier,'MATLAB:UndefinedFunction') warning('Function is undefined. Assigning a value of 0.'); else rethrow(ME) end end
Warning: Function is undefined. Assigning a value of 0.
对 notaFunction
的调用本身会导致错误。使用 try
和 catch
时,此代码捕获未定义的函数异常并将其重新打包为警告,这样 MATLAB 就可以继续执行后续命令。如果捕获的异常具有不同的错误标识符,则 MATLAB 会重新引发该异常。
扩展功能
基于线程的环境
使用 MATLAB® backgroundPool
在后台运行代码或使用 Parallel Computing Toolbox™ ThreadPool
加快代码运行速度。
此函数完全支持基于线程的环境。有关详细信息,请参阅在基于线程的环境中运行 MATLAB 函数。
版本历史记录
在 R2007b 中推出
MATLAB 命令
您点击的链接对应于以下 MATLAB 命令:
请在 MATLAB 命令行窗口中直接输入以执行命令。Web 浏览器不支持 MATLAB 命令。
Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
You can also select a web site from the following list:
How to Get Best Site Performance
Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.
Americas
- América Latina (Español)
- Canada (English)
- United States (English)
Europe
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)