2015-09-30 2 views
0

Рассмотрим следующий foo.m файл:Matlab: показать путь, полный ошибок

try 
    disp(r3) 
catch ME 
    disp(getReport(ME)) 
end 

Когда я запускаю его:

matlab -nodisplay -nodesktop -nosplash -nojvm -wait -r "run('foo.m')" 

я получаю:

Undefined function or variable 'r3'. 

Error in foo (line 2) 
    disp(r3) 

Error in run (line 96) 
evalin('caller', [script ';']); 

мне было интересно, если это можно отобразить полный путь к файлам, на которые ссылаются ошибки. Я знаю, что могу использовать which и, например, получить:

» which run 
C:\prog-lang\matlab\toolbox\matlab\lang\run.m 

Но я хотел бы ошибки, которые будут непосредственно отображаться как

Error in C:\prog-lang\matlab\toolbox\matlab\lang\run.m (line 96) 

, а не

Error in run (line 96) 

ответ

1

Одним из вариантов является просто взломать отчет об ошибке, который возвращается getReport, например, используя эту функцию для поиска и замены каждого экземпляра «foo» на полный путь к файлу -

function msg = getReportFull(e) 

    stack = dbstack(); 
    stack(1) = []; 

    msg = getReport(e); 

    for i = 1:length(stack) 
     fname = stack(i).name; 
     fpath = which(stack(i).file); 
     msg = strrep(msg, ['>' fname '<'], ['>' fpath '<']); 
    end 

end 

Затем с помощью следующего кода в "foo.m" -

try 
    disp(r3); 
catch e 
    disp(getReportFull(e)); 
end 

вы будете наблюдать эту ошибку -

>> run('foo.m') 
Undefined function or variable 'r3'. 

Error in C:\foo.m (line 2) 
    disp(r3); 

Error in C:\Program Files\MATLAB\R2012b\toolbox\matlab\lang\run.m (line 64) 
evalin('caller', [script ';']); 

Это абсолютно непроверенный хак, и я делаю не гарантирует, что он не сломается в действительно неподходящий момент.

+0

Спасибо за ваш ответ. К сожалению, когда я пытаюсь выполнить свою функцию и код, я все равно получаю базовое имя, а не полный путь. Я использую Matlab R2015a. Вы знаете, почему это может случиться? Еще один вопрос: ваше решение должно также работать с предупреждениями? – petobens

+0

Проблема заключается в том, что 'dbstack()' всегда возвращает пустой массив. Не знаю, как это исправить. – petobens

+0

Я попытался использовать 'try; surf, catch ME, disp (ME); disp (ME.stack); end', но при вызове 'foo.m' файла с' run ('foo') ',' ME.stack' пуст. – petobens

Смежные вопросы