GNU Octave 오류와 경고

GNU Octave 오류와 경고

프로그램이 계속 진행하기 어려운 상태가 되면 **오류(error)**가 발생해요. 예를 들어 함수를 인자 없이 호출하면 그 함수는 못 받은 인자를 알리는 오류를 내고 중단해야 해요. 반면 **경고(warning)**는 무언가 예상 밖의 일이 벌어졌다는 걸 알리지만 실행 중인 프로그램을 중단하지는 않아요.

출처: GNU Octave 오류와 경고

본문

오류 발생시키기 (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)), 특정 경고를 켜거나 끌 수 있어요.

더 알아보기