尝试...最终在Matlab中等效

Rom*_*lov 11 error-handling matlab

可能重复:
如何以异常安全的方式处理MATLAB中的资源?(比如"试试......终于")

我用这种方式使用Matlab并行计算工具箱:

matlabpool open 

parfor …

matlabpool close
Run Code Online (Sandbox Code Playgroud)

如果发生错误parfor,则程序终止,并且matlabpool未关闭.当我修复错误并再次运行它时,matlabpool open失败,因为它已经打开.所以我需要手动关闭它,这是我永远忘记的.理想的方法是将其更改为(伪代码):

matlabpool open 
try
  parfor …
finally
  matlabpool close
end
Run Code Online (Sandbox Code Playgroud)

这有什么最好的做法吗?

And*_*nke 20

使用onCleanup.它允许您设置在退出作用域时将执行的代码,无论正常还是错误退出.所以它最终起作用,加上它在清理中取消异常,并且所有onCleanups都是独立的.

function doSomething
matlabpool open
cleaner = onCleanup(@() matlabpool('close'));
parfor ...
%// and then no need to call close here
Run Code Online (Sandbox Code Playgroud)

您需要将其更改try...finally为一个函数,或将其粘贴到一个函数中,以使其正常工作.清理代码仅在GC清除内容时执行,cleaner当您离开函数时(或手动清除它)时,它的工作区超出范围.与其他一些语言不同,Matlab的try块不是变量的词法范围; 第一次在一个内部分配的变量try会一直存在,直到剩下它们的封闭功能.对于所有其他块也是如此:该函数是局部变量生命周期的唯一范围.

  • 请注意,这仅在您离开函数时执行,而不是离开`try ... catch`.在这种情况下,我认为这不重要. (4认同)