2011-03-01 89 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似乎沒有我想要的功能,這可能是最好的解決方法之一。 –

相關問題