2017-09-14 1 views
4

여러 줄의 코드를 실행하고 싶지만 어떤 줄에서 오류가 발생하는지 확신 할 수 없습니다. 그러나 오류가 발생하면 스크립트에서 해당 줄을 무시하고 계속 진행하고 싶습니다.matlab에 대한 순차적 캐치 엔드 블록

하나의 선택은 오류를 던질 수있는 코드 블록을 건너 뛰는 try-catch-end 블록을 갖는 것입니다. 그러나 오류가 발생하자마자 try 문에서 오류가 발생한 후 나머지 코드는 실행되지 않습니다.

TL : TR : 다음 예제 코드에서 각 줄마다 try-catch-end 블록을 쓰는 것보다 다른 선택이 있습니까?

예제 코드 :

try 
    disp('1st line'); 
    disp('2nd line'); 
    PRODUCE_ERROR; %throws an error, variable/function does not exist 
    disp('3rd line'); %%%%% 
    disp('4th line'); % these lines I would like to keep executing 
    disp('5th line'); %%%%% 
catch 
    disp('something unexpected happened'); 
end 

출력 : 선호 될 것이다

1st line 
2nd line 
something unexpected happened 

출력 :

1st line 
2nd line 
something unexpected happened 
3rd line 
4th line 
5th line 

관련 : Why should I not wrap every block in "try"-"catch"?

+0

이 문제를 재귀 적으로 해결할 수있는 방법을 생각해 볼 수는 있지만, 아마도 가장 우아한 방법은 아닙니다. – user2305193

+0

오류를 다시 발생시키지 않고 나머지 코드를 계속 진행할 수 있습니다. [mcve]를 게시 할 수 있습니까? – beaker

+0

오류를 다시 발생시키지 않더라도 나머지 'catch'브랜치는 건너 뜁니다. 예를 들어'clear, a = 1; c = 3; –

답변

4

하나의 옵션을 넣어하는 것입니다 함수의 각 코드 섹션을 function handlescell array에 대해 반복합니다. 이 기능은 아직까지도 한 후 평가 보여주는 생성 출력 여기서 에러 드로우있어

fcnList = {@() disp('1'); ... 
      @() disp('2'); ... 
      @() error(); ... % Third function throws an error 
      @() disp('4')}; 

for fcnIndex = 1:numel(fcnList) 
    try 
    fcnList{fcnIndex}(); % Evaluate each function 
    catch 
    fprintf('Error with function %d.\n', fcnIndex); % Display when an error happens 
    end 
end 

하고 :

1 
2 
Error with function 3. 
4 

상기 예에서는 케이스 작동 여기 anonymous functions의리스트 예이다 개별 행 코드를 순차적으로 평가하려고하지만 여러 줄을에 익명으로 입력 할 수는 없습니다. 이 경우 더 큰 작업 공간에서 변수에 액세스해야한다면 nested functions으로, 독립적으로 작동 할 수있는 경우 local functions으로 이동합니다.

function fcn1 
    b = a+1;  % Increments a 
    fprintf('%d\n', b); 
end 
function fcn2 
    error();  % Errors 
end 
function fcn3 
    b = a.^2; % Squares a 
    fprintf('%d\n', b); 
end 

a = 2; 
fcnList = {@fcn1 @fcn2 @fcn3}; 

for fcnIndex = 1:numel(fcnList) 
    try 
    fcnList{fcnIndex}(); 
    catch 
    fprintf('Error with function %d.\n', fcnIndex); 
    end 
end 

그리고 출력 : 여기에 중첩 된 기능을 가진 예입니다

3 
Error with function 2. 
4 
+0

은 익명의 목록으로 코드 줄을 변환하는 것이 더 빠르고 더러운 방법입니다 기능? – user2305193

+0

@ user2305193 : 다른 예를 추가했습니다. 희망이 도움이됩니다. – gnovice

+0

나는이 코드 라인을 검색 할 때와 같이 간단하게 말하면됩니다. 그러나 나는 이것이 당신이 간단한 메모장 대체 명령 (적어도 Windows에서는)으로 할 것이라고 생각합니다. 여러 줄의 코드를 가진 예제는 나에게 이해가되지 않는다. 내가 볼 수있는 한, 모든 커맨드 라인에서 try-catch-end 문을 작성하는 데 약 같은 양의 코드가 필요하기 때문이다. – user2305193

1

더 간단한 방법은 포함 라인으로 스크립트 파일 라인을 읽고 차례로 각 행을 평가. 이 스크립트는 실행하려는 스크립트에 여러 줄로 된 구문 (예 : for, 다른 줄에 end이있는 구문 또는 ...을 사용하여 여러 줄로 분리 된 구문)을 포함하지 않는다고 가정합니다. 이는 매우 제한적이며, 이는 예를 들어, 여러 행의 텍스트를 사용하여 행렬을 초기화합니다.

function execute_script(fname) 
fid = fopen(fname,'rt'); 
n = 0; 
while ~feof(fid) 
    cmd = fgetl(fid); 
    n = n+1; 
    if ~isempty(cmd) 
     try 
     evalin('caller',cmd); 
     catch exception 
     disp(['Error occurred executing line number ',num2str(n),': ',exception.message]); 
     end 
    end 
end 

그것은 내가 전술 한 바와 같이 정확하게 수행합니다 :

은 함수가 줄을 읽고, 다음 호출자의 작업 공간에서 그 라인을 평가하는 evalin를 사용합니다. 작성된 변수는 호출자의 작업 공간에서 작성됩니다. 사용 된 모든 변수는 호출자의 작업 영역에서 가져옵니다.matlab에 명령 프롬프트에서

A = 1; 
B = 2+C; % This line needs a variable not defined in the script! 
D = 5; 

다음 :

예를 들어, 나는 다음과 같은 내용으로 파일 testscript.m을 만들

>> execute_script('testscript.m') 
Error occurred executing line number 2: Undefined function or variable 'C'. 
>> whos 
    Name  Size   Bytes Class   Attributes 

    A   1x1     8 double     
    D   1x1     8 double     

AD가 생성 된 변수입니다. 내가 C 정의하는 경우 : 정의 된 변수 C으로

>> C=0; 
>> execute_script('testscript.m') 
>> whos 
    Name  Size   Bytes Class   Attributes 

    A   1x1     8 double     
    B   1x1     8 double     
    C   1x1     8 double     
    D   1x1     8 double     

를, 스크립트 오류없이 실행하고, 또한 B을 정의합니다.