2012-04-11 4 views
0

Я пишу скрипт matlab, где мне бы хотелось узнать имя скрипта, который один шаг вверх в стеке. Причина, по которой я нуждаюсь в этом, заключается в том, что я пишу вспомогательный скрипт для вызова некоторых основных фактов о рабочей области, прежде чем заниматься более тяжелыми вычислениями, а вспомогательный скрипт должен иметь возможность выдавать сообщения об ошибках при вызове сценариев вычислений.Получите имя файла matlab на один шаг вверх в стеке

Я пробовал использовать mfilename и dbstack, но мне не удается получить ничего, кроме имени вспомогательного скрипта.

Чтобы объяснить далее, у меня есть следующие сценарии:

  • 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

на самом деле я удивлен, что ваш 'ошибка ([... mdfilename]) 'code only prints verify_base_conditions. Ошибки norma lly распечатать весь стек вызовов. – Richante

+0

Я получаю весь стек вызовов, если я выполняю весь файл (например, нажав F5), но не тогда, когда я выполняю только одну ячейку. Это то, что я обычно делаю ... –

+0

...но теперь, почему-то совершенно вне моего понимания, он внезапно начал работать. Я использую ваше первое предложение, и оно работает как шарм! –