我如何在不使用try/catch的情况下做到这一点?

3次观点(过去30天)
克一个
克一个 2021年8月22日
评论道: 克一个2021年8月23日
我在Run_pushbutton_Callback (GUIDE GUI)中使用waitbar:
功能Run_pushbutton_Callback (hObject, ~,处理)
尝试
wb = waitbar(0,“计算…”“名字”'myprogname');
WBCH = ALLCHILD(WB);
摩根大通= wbch (1) .JavaPeer;
JP.SetIndeterminate(1);
%呼叫主函数
handles.mainfunc(年代);%s是变量的结构
关闭(wb);%关闭对话框
抓住
关闭(wb);%关闭对话框
errormessage = sprintf('函数%s()中的错误in%d。\ n \ neRror消息:\ n%s'...
ME.stack (1) . name, ME.stack(1)。线,ME.message);
FPRINTF(2,'%s \ n', 错误信息);
Uiwait(errordlg(errormessage));%错误对话框
%Rethrow(我);%重新定位在命令窗口中的完整错误消息(如果需要)
结束
guidata (hObject处理);
什么时候 mainfunc() 抛出一个错误,备注仍然继续眨眼 - 没有尝试/捕获。我用来尝试/捕获解决方案来关闭它。但是,Matlab文档表明,尝试/ catch中不支持内存优化等:万博1manbetx //www.tianjin-qmedu.com/help/matlab/matlab_prog/avod-unneetary-copies-of-data.html.
而且,在整个程序中使用try/catch看起来有点尴尬。
  1. 如何在错误后关闭waitbar而不使用try/catch?
  2. 如果函数在try/catch块中,那么原位优化或其他优化如何不能在函数及其子函数(非嵌套)中工作?

接受答案

沃尔特罗伯森
沃尔特罗伯森 2021年8月22日
要摆脱截止靠背的尝试/捕获,请使用
cleanme = oncleanup(@()删除(WB));
如果你把它放在一个函数中,你甚至不需要在迭代结束时自己删除等待条——等待条将在函数正常返回时被删除。当函数因为error()而终止时,等待条也将被删除,因此变量将被删除。
(如果您愿意,您仍然可以提前删除助手栏,例如如果要启动不同的服务栏。)
在try/catch中禁用某些优化的原因:
当您有一个没有try/catch的函数时,那么与执行引擎的隐式“契约”就是执行引擎将执行代码所暗示的操作,并在函数返回时准备好答案。
注意,我并没有说它将按顺序执行代码行:MATLAB允许根据操作的“含义”而不是代码行的详细说明重写操作。
例如,如果你有一个循环
k = 1:1E8
D(k) = a (k) + b (k) .* c (k);
结束
然后没有“合同”,MATLAB将执行循环1E8次并为每个循环迭代执行一个乘法:允许MATLAB,而是调用可以拆分迭代的高性能线性代数“乘法并添加”核心之间,甚至可能使用硬件fma(融合乘以和添加 - https://en.wikipedia.org/wiki/multiply%e2%80%93Accumulate_operation. )。或者哪些可能不是宿布精确的原因,但高性能代码可能知道如何粘在分支延迟插槽中的添加,因此或多或少“免费获得”。
在一些情况下,MATLAB能够识别出一个特定的操作,比如W * X * W',它意味着得到的矩阵的一些性质,因为它能够在同一行的其他操作上采取更有效的计算路径。同样,在理论上,如果MATLAB认识到一个特定的操作应该返回一个对称的结果,那么MATLAB只允许实际 一个三角形,并从上半场结果填充下半年。
也就是说:
在那里 一个与程序员的“契约”,即在Catch异常发生时,变量将处于一种状态 好像 在出现异常之前,这些行一直按照编写的方式执行。MATLAB发现,实现这一点的最简单的方法有时是在try/catch中禁用一些优化。
理论上,限制应该仅适用于直接在Try块内显示的代码,以及讲述任何一个被解除覆盖的例程,以至于它们不允许为尝试时范围内的变量执行此操作。.嵌套函数可以共享变量,以便它们可能需要盗贼。但 不做的功能不必危机,因为它们具有自己的合同及其内部变量,可能在所谓的异常情况下无法返回给呼叫者常规。
3评论

登录评论。

更多的答案(0)

s manbetx 845

社区宝藏狩猎

在MATLAB中心找到宝藏,并发现社区如何可以帮助你!

开始狩猎!