Matlab 捕获异常

Matlab 捕获异常

在写Matlab小程序的时候,经常会遇到一些细小的错误或异常。在运行程序时,希望能够捕获这些错误并将其错误信息输出,然后再写发生错误时对应的处理程序。在此总结一下Matlab的错误捕捉并选择性地输出错误信息。

1、MException 捕获异常信息类

Matlab提供了一个MException类来保存执行代码时捕获到的错误信息。当发现错误时,Matlab即生成一个MException类对象,该对象具有以下属性和函数。

属性:

    identifier:为一个字符串,每一个错误对应一个identifier,其至少包含两个用分号“:”隔开的子串,主要形式为COMPONENT:MNEMONIC。

    message:为一个字符串,主要用于向用户反馈错误信息。

    stack:用于保存各个m文件之间调用的栈关系

    cause:造成错误的MExceptions所组成的元包阵列Cell Array。

函数:

    throw():将错误信息在命令窗口command window上输出,并终止程序的执行。

    rethrow():将已经捕获的错误重新在命令窗口command window上输出,并终止程序的执行。

    throwAsCaller():用调用函数的方式将错误信息在命令窗口command window上输出。

    addCause():将两个MException错误信息进行叠加,并返回一个新的MException对象,该对象包含了被叠加的两个MException对象的错误信息。

    getReport():获取错误信息的message属性并返回。

    last():返回最新的一个未被捕获的错误信息。

2、捕获异常的基本形式

形式1

将捕获的错误直接传递到一个MException对象ErrorInfo,让Matlab对ErrorInfo对象的属性(identifier、message等属性)进行赋值。

a = [1,2,3];
b = [2,3];
try 
    c = [a; b]; %有错误(列的维度不一致),跳转到catch语句行并执行
    disp(c);    %发现错误后,该行代码不执行
catch ErrorInfo %捕获到的错误是一个MException对象
    disp(ErrorInfo);
    disp(ErrorInfo.identifier);
    disp(ErrorInfo.message);
    disp(ErrorInfo.stack);
    disp(ErrorInfo.cause);
    
    %发生错误时的其他动作

end

形式2

直接生成一个MException对象ME,并手动对ME对象中的属性进行初始化赋值。

MException类对象的初始化格式为:

MException(MSGID, ERRMSG, V1, V2, ..., VN),其中MSGID为identifier,ERRMSG为message,其中ERRMSG可以为包含%s、%d等格式控制字符串,而V1、V2...VN则为格式控制串对应的值。

inputstr = input('Type a variable name:', 's');
if ~exist(inputstr, 'var')
   ME = MException('MyComponent:noSuchVariable', 'Variable %s not found', inputstr);%直接生成一个MException对象,并初始化
   throw(ME);
end

3、函数介绍

3.1 throw()

将错误信息在命令窗口command window上输出,并终止程序的执行。其在命令窗口输出的是错误对象的message属性。


3.2 rethrow()

已经捕获的错误重新在命令窗口command window上输出,并终止程序的执行。利用该函数可以将上面的ErrorInfo重新抛出一次。注意两者的细微区别。


3.3 throwAsCaller()

用调用函数的方式将错误信息在命令窗口command window上输出。利用该函数采用调用函数的形式将错误信息在命令窗口command window上输出。


3.4 addCause()

将两个MException错误信息进行叠加,并返回一个新的MException对象,该对象包含了被叠加的两个MException对象的错误信息。

如下所示,cause1_ME表示矩阵越界访问错误,cause2_ME表示不存在这样的文件时仍然load的错误。然后通过将这两种错误信息进行叠加,具体效果如下图所示。



3.5 getReport()

获取错误信息的message属性并返回。


3.6 last()

返回最新的一个未被捕获的错误信息。如下所示,ErrorInfo是之前捕获的错误信息,然后重新制造一个matlab错误(越界访问矩阵),并且该错误并没有被matlab捕获到一个MException对象中,因此可以用该函数返回最新的一个未被捕获的错误信息。


### 使用 MATLAB 捕获计算器窗口画面 在 MATLAB 中可以利用 `robot` 类库中的功能来实现屏幕截图操作。通过调用 Java 的 Robot 库,可以从指定区域捕获图像并保存为文件[^1]。以下是具体方法: #### 方法概述 MATLAB 提供了与 Java 集成的功能,可以通过 Java 的 AWT 和 Swing 工具包访问屏幕捕获工具。Robot 类允许程序控制鼠标和键盘输入,并支持截取整个屏幕或特定窗口的内容。 #### 实现代码示例 以下是一个完整的 MATLAB 脚本,用于捕获屏幕上某个矩形区域的截图(例如计算器窗口的位置)。假设已知目标窗口的坐标范围,则可以直接设置裁剪参数。 ```matlab % 创建 Java Robot 对象实例 import java.awt.Robot; import java.awt.Toolkit; import java.awt.Rectangle; import java.awt.image.BufferedImage; try robot = Robot(); catch ME error('无法初始化 Java Robot: %s', ME.message); end % 获取屏幕尺寸 screenSize = Toolkit.getDefaultToolkit().getScreenSize(); % 定义要捕捉的目标区域 (左上角 X,Y 坐标以及宽度高度) captureRect = Rectangle(0, 0, screenSize.width / 2, screenSize.height / 2); % 执行屏幕抓图 imageData = robot.createScreenCapture(captureRect); % 将 BufferedImage 数据转换为 MATLAB 图像矩阵形式 imgArray = reshape(typecast(imageData.getData().getDataStorage(), 'uint8'), ... [size(imageData), 4]); % RGBA 格式 % 显示图片或者存储到磁盘 imshow(imgArray(:, :, 1:3)); % 只显示 RGB 渠道部分 imwrite(imgArray(:, :, 1:3), 'calculator_screenshot.png'); % 存储 PNG 文件 ``` 此脚本会创建一个屏幕截图并将结果保存至当前工作目录下的名为 `calculator_screenshot.png` 的文件中[^1]。 #### 关键点说明 - **Java Integration**: 上述例子依赖于 MATLAB 内置的支持运行任意合法 JAVA API 的能力。 - **Rectangle Definition**: 用户需自行调整 `captureRect` 参数以匹配实际待采集的应用界面位置及大小。 - **Error Handling**: 添加异常处理机制以便更好地调试可能发生的错误情况。 #### 注意事项 如果希望自动定位特定应用程序窗口而非手动设定其几何边界框,则需要额外借助操作系统级别的工具或第三方库完成更复杂的交互逻辑[^1]。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

bible_reader

如果觉得文章有用,欢迎打赏支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值