• Matlab中MException的使用


    目录

    语法

    说明

    示例

    创建 MException 对象

    创建包含格式化错误消息的 MException

    创建并引发 MException 对象

    访问 MException 对象中的信息

    响应抛出的异常


            MException函数的功能是捕获错误信息。

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

    语法

    1. ​ME = MException(errID,msgtext,A1,...,An)
    2. ME = MException(errID,msgtext)

    说明

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

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

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

            错误标识符包括一个或多个组件字段和一个助记键字段。各字段必须用冒号分隔。例如,具有组件字段 component 和助记键字段 mnemonic 的错误标识符指定为 'component:mnemonic'。

    • 组件字段通常指定可能出现各种错误的产品或功能。例如,错误标识符 'MATLAB:TooManyInputs' 有组件字段 MATLAB,这意味着在 MATLAB 中抛出异常。可以重用同一个助记键 TooManyInputs,只要在它前面加上不同组件即可。例如,如果想要每当调用函数时使用过多的输入就在工具箱中抛出异常,可以使用 'MyToolbox:TooManyInputs'。

    • 错误标识符的助记键字段通常是特定于错误问题的标记。例如,当报告由于在 MATLAB 中使用模糊语法而导致的错误时,您可以将错误标识符指定为 'MATLAB:ambiguousSyntax'。

    对象函数

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

    示例

    创建 MException 对象

            创建 MException 对象来捕获关于输入错误的信息。

    1. errID = 'myComponent:inputError';
    2. msgtext = 'Input does not have the expected format.';
    3. ME = MException(errID,msgtext)
    4. ME =
    5. MException with properties:
    6. identifier: 'myComponent:inputError'
    7. message: 'Input does not have the expected format.'
    8. cause: {}
    9. stack: [0x1 struct]
    10. Correction: []

    创建包含格式化错误消息的 MException

            同时使用 msgtext 和 A1,...,An 输入参数来创建错误消息。

    1. errID = 'MATLAB:test';
    2. msgtext = 'There are %d errors on this page';
    3. A1 = 10;
    4. ME = MException(errID,msgtext,A1)
    5. ME =
    6. MException with properties:
    7. identifier: 'MATLAB:test'
    8. message: 'There are 10 errors on this page'
    9. cause: {}
    10. stack: [0x1 struct]
    11. Correction: []

    创建并引发 MException 对象

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

    1. str = input('Type a variable name: ','s');
    2. if ~exist(str,'var')
    3. ME = MException('MyComponent:noSuchVariable', ...
    4. 'Variable %s not found',str);
    5. throw(ME)
    6. end

            在命令提示符处,输入工作区中不存在的任何变量。例如,输入 notaVariable。

    Variable notaVariable not found

            由于 notVariable 不在您的工作区中,MATLAB 会创建并抛出一个 MException 对象。

    访问 MException 对象中的信息

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

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

    1. try
    2. surf
    3. catch ME
    4. disp('Error Message:')
    5. disp(ME.message)
    6. end
    7. Error Message:
    8. Not enough input arguments.

            提取错误标识符。

    1. ME.identifier
    2. ans =
    3. 'MATLAB:narginchk:notEnoughInputs'

            查询 stack 属性的内容。在此示例中,调用堆栈表示为一个 2×1 结构体数组。

    1. for i = 1:numel(ME.stack)
    2. ME.stack(i)
    3. end
    4. ans =
    5. struct with fields:
    6. file: 'matlabroot\toolbox\matlab\graph3d\surf.m'
    7. name: 'surf'
    8. line: 49
    9. ans =
    10. struct with fields:
    11. file: 'c:\myMATLABfiles\myfile.m'
    12. name: 'myfile'
    13. line: 2

            stack 的第一个元素显示发生异常的文件名 (surf.m)、函数名称 (surf) 和行号 (49)。stack 的第二个元素显示调用脚本中出现异常的名称和行号。

    响应抛出的异常

            捕获通过调用不存在的函数 notaFunction 生成的异常。如果该函数未定义,会发出警告并为输出赋值 0。

    1. try
    2. a = notaFunction(5,6);
    3. catch ME
    4. if strcmp(ME.identifier,'MATLAB:UndefinedFunction')
    5. warning('Function is undefined. Assigning a value of 0.');
    6. else
    7. rethrow(ME)
    8. end
    9. end
    10. Warning: Function is undefined. Assigning a value of 0.

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

  • 相关阅读:
    一个月黑风高的夜晚紧急完成gitlab服务器数据迁移
    C++ std::string 删除指定字符
    flutter 时间戳转日期
    房屋租赁管理系统
    下载安装 VMware &虚拟机
    博客园众包平台:嵌入式开发任务悬赏5万,招募开发者接单
    湘江新区:金融活水赋能实体经济
    “蔚来杯“2022牛客暑期多校训练营5 I题: Board Game
    05.jvm常量池02
    P23~33第7章 一阶电路和二阶电路的时域分析 详情可以看看书
  • 原文地址:https://blog.csdn.net/jk_101/article/details/111032693