2012-04-11 37 views
0

我正在寫一個matlab腳本,我想知道腳本的名稱,它是中的一個步驟在堆棧中。我需要這個的原因是我正在編寫一個助手腳本來調用一些關於工作區的基本事實,然後再進行更重的計算,並且助手腳本應該能夠在調用計算腳本時給出錯誤消息。獲取堆棧中的matlab文件的名稱

我已經嘗試過使用mfilenamedbstack,但我沒有設法從他們那裏得到任何幫助者腳本的名字。

爲了進一步解釋,我有以下腳本:

  • verify_base_conditions:輔助腳本,呼籲第一線之一
  • heavy_stuff_calculation
  • sweet_mother_of_algorithms
  • general_entry_point:一個腳本,我聚集在細胞中常見的工作流程

我儘量保持入口點腳本儘可能小,並重構重計算(或任何需要的不僅僅是幾行,真)轉換爲基於任務的可重用腳本。如果是我,從入口點腳本,調用sweet_mother_of_algorithms併爲此腳本運行的基本條件沒有滿足,我希望看到像

Error: this_cool_var must be defined when running sweet_mother_of_algorithms 
general_entry_point line 15 

的錯誤消息我試着用

error(['this_cool_var must be defined when running ' mdfilename]) 

和其他類似的結構,但我不能讓錯誤消息說除了verify_base_conditions

如何找到在堆棧中運行一級的腳本的名稱?

(注:我在尋找在堆棧的底部運行腳本不興趣 - 這幾乎總是general_entry_point我得到那個叫verify_base_conditions腳本的名稱,只是有興趣)

回答

1

dbstack應該爲此工作。我認爲這是一個類似的建立到你:

a.m: 
    b; 

b.m: 
    c; 

c.m: 
    stack = dbstack; 
    for i=1:3 
    disp(stack(i)); 
    end 

當我運行a;,這樣就會打印出整個堆棧,包括b(我認爲這是你想要的 - 在調用中的第二頂項。棧

另外,儘管這可能使完全相同的結果,你可以拋出並捕獲錯誤並看看它的堆棧:

c.m: 
    try 
    error('What is on the call stack?'); 
    catch e 
    for i=1:3 
     disp(e.stack(i)); 
    end 
    end 
+0

其實我很驚訝,你的'誤差(... ''code只打印verify_base_conditions。錯誤的標準打印出整個調用堆棧。 – Richante 2012-04-11 13:58:50

+0

如果我執行整個文件(例如,按下F5),我確實會得到整個調用堆棧,但是當我執行一個單元格時不會。這是我通常做的... – 2012-04-11 14:54:51

+0

...但現在,由於某種原因,我完全無法理解,它突然開始工作。我正在使用你的第一個建議,它就像一個魅力! – 2012-04-11 14:59:08