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

时间:2012-01-26 16:06:24

标签: matlab error-handling

  

可能重复:
  How do you handle resources in MATLAB in an exception safe manner? (like “try … finally”)

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

matlabpool open 

parfor …

matlabpool close

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

matlabpool open 
try
  parfor …
finally
  matlabpool close
end

这有什么最好的做法吗?

1 个答案:

答案 0 :(得分:20)

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

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

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