2011-03-01 52 views
3

我有一个Matlab脚本,它应该能够独立执行(即,我可能需要执行一个单元以执行另一个单元,但直到我清除工作区,我应该能够执行第二个单元格而不执行第一个单元格)。这些单元中的代码有时会失败(当然),如果他们这样做,我想运行一个特定的命令。由于代码跨越几个独立的单元格,因此我不能使用try/catch块来实现这一点 - 除非我在每个单元格中放置一个try/catch块,而我并不想这样做。每个单元格都很短(主要是带有函数调用的几行代码),因此在每个单元格中引入try/catch块可能会使脚本长度加倍。在没有try/catch的情况下在错误时运行指定的命令

具体而言,我想打开在第一小区,其自动地(diary off)关闭一个日志文件(diary filename.log)后发生的错误(和记录)从任何细胞。这个设置应该至少在日志文件再次关闭之前,并且应该以编程方式设置(我想将它设置在同一个单元格中,我打开日志文件)。

我该如何做到这一点?

+0

为什么你的代码失败?假设您可以设置这些边界,您可以替换支持您的代码的语句吗? –

+0

是否有充分的理由为你的代码使用这种蜂窝体系结构?也许我对细胞模式并不了解,但我总是将其视为帮助原型命令的工具。一旦你有一个你喜欢的工作,你应该把它封装在一个函数中。 – Miebster

+0

我使用蜂窝结构能够多次重复部分代码,而只需运行一次其他(慢)任务。在这个特定的情况下,我首先建立一个3D几何(慢),然后模拟CT扫描(快得多),同时改变一些参数。我想记录每次运行,不管我的代码是如何完成的,但是我希望每次运行都在不同的日志文件中。我在模拟开始时打开日志,以时间戳命名,但如果代码失败,我想关闭日志以解决问题,而不是在一个文件中运行gzillion失败。 –

回答

0

如果你想保留你的代码作为脚本,你最好的解决方案是在每个单元周围放一个try/catch块。

否则,您可以创建一个函数来环绕脚本。函数语法允许你设置'dbstop if error',这样代码执行就会停止在一个错误上,这个错误允许你检查变量并且找出错误的原因。

function output = run(listOfCells,input) 
%#RUN evaluates the cells listed in listOfCells 

try 

diary filename.log 

if any(listOfCells==1) 
%# evaulate cell 1 

end 

if any(listOfCells==2) 
%# evaluate cell 2 

end 

... 

catch 
%# close the diary in case of error 
diary off 
end %# try 
+0

如何执行此操作?通过调用'run([1 2 4],'my_script_name.m')'或者其他方式? –

+0

@Tomas Lycken:将#1单元格复制粘贴到第一个if子句中,将单元格#2复制到第二个if子句中等等。不要忘记将必要的输入参数传递给该函数。如果输入是'a','b'和'c',你可以调用'out = run([1 2 4],a,b,c)' – Jonas

+0

我可能不会使用这个(I'我会试着记住手动关掉日志),但是由于Matlab似乎没有我想要的功能,这可能是最好的解决方法之一。 –

相关问题