GNU Octave 오류와 경고
GNU Octave 오류와 경고
프로그램이 계속 진행하기 어려운 상태가 되면 **오류(error)**가 발생해요. 예를 들어 함수를 인자 없이 호출하면 그 함수는 못 받은 인자를 알리는 오류를 내고 중단해야 해요. 반면 **경고(warning)**는 무언가 예상 밖의 일이 벌어졌다는 걸 알리지만 실행 중인 프로그램을 중단하지는 않아요.
본문
오류 발생시키기 (Raising Errors)
오류의 가장 흔한 용도는 함수의 입력 인자를 검사하는 거예요. 다음 예시는 f가 인자 없이 호출되면 error 함수를 부릅니다.
function f (arg1)
if (nargin == 0)
error ("not enough input arguments");
endif
endfunction
error가 호출되면 주어진 메시지를 출력하고 Octave 프롬프트로 돌아가요. 즉 error 다음 코드는 실행되지 않아요.
오류에는 식별 문자열(ID)을 붙일 수 있어요. ID는 "NAMESPACE:ERROR-NAME" 형식이에요. "Octave" 네임스페이스는 Octave 자체 오류가 쓰고, 사용자 오류는 다른 문자열을 네임스페이스로 쓸 수 있어요. 이 ID로 오류를 구분해서 잡을 수 있어요.
error ("MyNameSpace:wrong-type-argument", "fcn_name: argument should be numeric");
오류 메시지가 줄바꿈으로 끝나지 않으면, Octave는 오류로 이어진 모든 함수 호출의 traceback을 출력해요.
f ()
error: nargin != 1
error: called from:
error: h at line 1, column 27
error: g at line 1, column 15
error: f at line 1, column 15
메시지가 줄바꿈으로 끝나면 traceback 없이 메시지만 출력해요. 빈 문자열을 error에 넘기면 그 문장은 무시(NOP)되고 계속 실행돼요 — MATLAB 호환 때문이에요.
print_usage 함수는 error와 비슷하지만 더 유용해요. 호출한 함수의 도움말 텍스트를 읽고, Texinfo라면 함수 프로토타입만 담은 오류 메시지를 보여줘요.
function f (arg1)
if (nargin == 0)
print_usage ();
endif
endfunction
오류 잡기 (Catching Errors)
오류는 try/catch 문으로 감지하고 처리할 수 있어요. 다음 코드는 for 루프 동안 발생한 오류의 개수를 셉니다.
number_of_errors = 0;
for n = 1:100
try
...
catch
number_of_errors++;
end_try_catch
endfor
오류마다 다르게 대응해야 한다면 lasterror 함수가 마지막 오류의 정보를 담은 구조체를 반환해요. 구조체 필드는 message(메시지), identifier(ID), stack(발생 위치의 file/name/line)이에요. catch 키워드 바로 뒤에 변수를 두면 그 변수로 오류 구조체를 직접 받을 수도 있어요.
try
...
catch err
warning(err.identifier, err.message);
end_try_catch
오류를 처리한 뒤에도 프로그램이 아직 중단되어야 한다면 rethrow로 그 오류를 다시 발생시킬 수 있어요. rethrow (lasterror) 형태로 쓰죠.
Octave 함수들이 내는 대표적인 오류 ID로는 Octave:bad-alloc(메모리 할당 실패), Octave:invalid-fun-call(잘못된 함수 호출), Octave:invalid-indexing(잘못된 인덱싱), Octave:parse-error(구문 해석 실패), Octave:undefined-function(정의되지 않은 함수 호출) 등이 있어요.
lasterr는 마지막 오류 메시지를 문자열로 반환하거나 설정해요. errno/errno_list는 시스템 의존적 errno 값을 조회·설정해요.
경고 처리하기 (Handling Warnings)
경고는 오류처럼 예상 밖의 일을 알리지만 프로그램을 중단하지는 않아요. 대표적인 예가 0으로 나누는 경우예요. Octave는 경고를 내고 결과에 Inf를 대입해요.
a = 1/0
-| warning: division by zero
⇒ a = Inf
경고도 오류와 마찬가지로 ID를 붙여서 발생시키고(warning (id, msg)), 특정 경고를 켜거나 끌 수 있어요.
더 알아보기
- Functions and Scripts — 함수 정의와 인자 검사
- Debugging — 디버그 모드와 중단점
- Statements — try/catch를 포함한 구문