Main Content

本页翻译不是最新的。点击此处可查看最新英文版本。

MException

捕获错误信息

说明

检测到错误并抛出异常的任何 MATLAB® 代码都构造一个 MException 对象。该 MException 对象包含有关错误的可检索信息。MATLAB 可以抛出预定义异常或您构造的异常。

创建对象

描述

示例

ME = MException(errID,msg) 捕获有关特定错误的信息,并将信息存储在 MException 对象 ME 中。MException 对象是使用错误标识符 errID 和错误消息 msg 构造的。

示例

通过 ME = MException(errID,msg,A),可以使用文本或数值 A 设置错误消息的格式,以便在运行时替换 msg 中的转换设定符。

输入参数

全部展开

错误标识符,指定为字符向量或字符串标量。将错误标识符用于异常处理可以更好地识别错误来源或控制在程序中选择的异常子集。

错误标识符包括一个或多个组件字段和一个助记键字段。各字段必须用冒号分隔。例如,具有组件字段 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'

有关错误原因以及如何进行更正的信息,指定为字符向量或字符串标量。要设置文本格式,请使用转义序列,例如 \t\n。还可以使用 sprintf 函数支持的任何格式设定符,例如 %s%d。使用 A 输入参数指定转换设定符的值。

示例: 'Error opening file.'

示例: 'Error on line %d.'

用来替换 msg 中的转换设定符的值,指定为字符向量、字符串标量或数值标量。

属性

全部展开

此 属性 为只读。

唯一标识错误的字符向量,由 errID 输入参数指定为字符向量。

示例: 'MATLAB:test'

此 属性 为只读。

包含在 MATLAB 引发异常时显示的错误消息的字符向量,由 msgA 输入参数指定。

示例: 'Variable x not found'

此 属性 为只读。

包含堆栈跟踪信息的结构体数组,其中包含文件名 (file)、函数名称 (name) 和 MATLAB 引发异常的行号 (line)。如果调用的函数中发生错误,则 stack 属性还包含文件名、函数名称以及所调用的每个函数的行号。MATLAB 仅在它引发异常时生成堆栈。

stack 是一个 N×1 struct 数组,其中 N 表示调用堆栈的深度。

此 属性 为只读。

导致 MATLAB 产生异常的 MException 对象的元胞数组。使用 addCause 方法将异常添加到 cause 属性。

此 属性 为只读。

对异常的建议修复,指定为 matlab.lang.correction.AppendArgumentsCorrectionmatlab.lang.correction.ConvertToFunctionNotationCorrectionmatlab.lang.correction.ReplaceIdentifierCorrection 对象。当引发异常但未将其捕获时,MATLAB 使用 Correction 属性来提供该异常的修复建议。

对象函数

throw引发异常
MException.last返回最后未捕获的异常
rethrow重新引发以前捕获的异常
throwAsCaller引发异常,如同发生在调用函数内
addCause记录异常的其他原因
addCorrection提供异常的建议修复
getReport获取异常的错误消息

示例

全部折叠

创建 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: []

同时使用 msgtextA1,...,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: []

如果工作区中没有输入变量名称,则会引发异常。

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 对象。

使用 try, catch 访问在 MException 对象中捕获的信息。

创建文件 myfile.m,其中包含对 surf 函数的不带输入的调用。(此函数调用会导致异常,用于演示目的。)捕获 MATLAB 在 MException 对象 ME 中抛出的异常,并通过访问 MEmessage 属性来显示错误消息。

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 的调用本身会导致错误。使用 trycatch 时,此代码捕获未定义的函数异常并将其重新打包为警告,这样 MATLAB 就可以继续执行后续命令。如果捕获的异常具有不同的错误标识符,则 MATLAB 会重新引发该异常。

扩展功能

版本历史记录

在 R2007b 中推出