如果在完全运行脚本时发生错误,则错误将显示发生错误的行号。但是,我在脚本编写过程中使用了“运行部分”(在Windows上进行控制 - 输入)很多。函数,然后出现没有行号的任何错误。
这会让我感到烦恼(双关语),因为这种行为确实没有充分的理由。这个问题之前提出here,但我发现答案非常不令人满意:'就是这样,就像使用命令行一样'。 我不同意,因为:a)我使用'run section'运行的代码块由行组成,块本身在脚本中有一定的行位置。应该可以知道这些行在脚本中的位置,从而也知道错误发生的位置; b)如果'run section'确实与在命令行中运行代码完全一样,那么执行的代码块仍然由行组成。然后至少可以知道块内的行号..对吗?
问题:使用“运行部分”运行部分脚本时,是否可以在错误消息中显示行号?如果没有,为什么技术上不可能?
MWE:
% this is my script
%% this is a section with an error
a(:) = zeros(1,2,3);
保存并运行(F5)给出行号(5)的错误,“运行”部分没有。
使用版本R2013a,R2016a中的行为相同
答案 0 :(得分:0)
根据Dev-il的有用评论(并且忽略了他对我的代码排序更好的建议)我制作了一个基本完成所要求的脚本:它运行当前部分(基于光标的位置)在编辑器中)通过制作该部分的副本并将其作为新脚本运行。这样做是为了保留行号,这样任何错误都可以与原始段中的行相关。
代码:
%% Copies currently selected section in editor to new file and runs it
filehandle = matlab.desktop.editor.getActive;
code = filehandle.Text;
pos = filehandle.Selection(1);
% convert to line by line cell
codeLines = strread(code,'%s','delimiter','\n','whitespace','');
NL = numel(codeLines); % number of lines
% find begin and end of current section
% begin
startSectionPos = [];
for ilr = 1:pos
il = pos + 1 -ilr; % starting at pos and going up
if isempty(startSectionPos) % not found yet
% test if section start
if ~isempty(regexpi(codeLines{il},'^(\s)*%%','start'))
% this line contains %% at beginning of the line
startSectionPos = il;
end
else % we found it already
codeLines{il} = ''; % delete lines
end
end
% end. we start at pos+1 if pos is start of section
endSectionPos = [];
for il = (pos+(pos==startSectionPos)):NL % going down
if isempty(endSectionPos) % not found yet
% test if next section start
if ~isempty(regexpi(codeLines{il},'^(\s)*%%','start'))
% this line contains %% at beginning of the line
endSectionPos = il-1; %previous section ended previous line
codeLines{il} = ''; % delete line
end
else % we found it already
codeLines{il} = ''; % delete lines
end
end
%%
%newCode = char(codeLines);
% save m file containing only selected section
filename = 'section.m';
fid = fopen(filename, 'wt');
fprintf(fid, '%s\n',codeLines{:});
fclose(fid);
% test if there are too many 'end's left at the end of the file
complaints = mlint(filename);
Nc = numel(complaints);
linesErr = [];
for icr = 1:Nc
ic = Nc + 1 - icr; % start at bottom, go up
if strcmpi(complaints(ic).message,'Parse error at END: usage might be invalid MATLAB syntax.')
linesErr = [linesErr; complaints(ic).line];
end
end
% fix loose ends
for il = 1:numel(linesErr)
codeLines{linesErr(il)} = ''; % delete lines
end
% write again
filename = 'section.m';
fid = fopen(filename, 'wt');
fprintf(fid, '%s\n',codeLines{:});
fclose(fid);
%% run new file, give nice report if error
try
run(filename)
catch err
err.getReport
end
使用方法: 将代码保存为路径中的runSection.m。在编辑工作。如果要运行某个部分,请将光标放在该部分中,然后键入' runSection'在命令窗口中或通过键盘绑定(快捷方式)启动runSection.m,可以使用内置的short cuts placed on Quick Access进行设置。现在你可以在control-enter上使用alt-1来运行你的部分!设置绑定的另一种方法是EditorMacro,目前已过时。