다음: 오류 복구, 이전: 오류 계기, 상위 문서: 오류 다루기   [차례][찾아보기]


12.1.2 오류 잡기

오류가 발생하면, 시행문에 기술된 try문으로 오류를 탐지하고 처리할 수 있습니다. 예를 들어, 아래 for 반복문 동안 발생한 오류 횟수를 세는 부호 일부분입니다.

number_of_errors = 0;
for n = 1:100
  try
    …
  catch
    number_of_errors++;
  end_try_catch
endfor

위 예시는 모든 오류를 같은 방식으로 처리합니다. 그러나 많은 경우에 오류를 구분하여 오류에 따라 다른 조치를 취하여야 합니다. lasterror 함수가 마지막으로 발생한 오류에 대한 정보를 담은 구조체를 반환합니다. 예를 들어, 위 부호에서 ‘*’ 연산자 관련 오류만 골라 셀 수 있습니다.

number_of_errors = 0;
for n = 1:100
  try
    …
  catch
    msg = lasterror.message;
    if (strfind (msg, "operator *"))
      number_of_errors++;
    endif
  end_try_catch
endfor

아니면 아래 예시에서 오류를 경고로 재지정하는 것처럼 lasterror 함수의 출력을 catch 예약어에 덧붙은 변수에서 찾아도 됩니다.

try
  …
catch err
  warning(err.identifier, err.message);
  …
end_try_catch
마지막_오류 = lasterror ()
lasterror (오류)
lasterror ("reset")

마지막 오류 문구 구조체를 조회 또는 설정합니다.

매개변수 없이 호출하면, 마지막 오류 문구와 그 오류와 관련한 정보를 담은 구조체를 반환합니다. 다음은 구조체 원소입니다.

message

오류 문구글입니다.

identifier

오류 문구의 안내 식별자입니다.

stack

구조체는 오류 문구가 나온 곳에 대한 정보를 담습니다. 정보를 못 구하면 빈 구조체가 됩니다. 이 구조체의 기록란입니다.

file

오류가 발생한 기록철 이름입니다.

name

오류가 발생한 함수 이름입니다.

line

오류가 발생한 줄 번호입니다.

column

오류가 발생한 행 번호로써 선택 기록란입니다.

오류에 스칼라 구조체를 넣어 마지막 오류 구조체를 설정할 수 있습니다.  err 기록란과 위에 열거한 기록란 중 일치하는 모든 기록란을 err 기록란으로 설정하고, 일치하는 오류 기록란이 없는 기록란은 기본값으로 초기화합니다.

lasterror를 매개변수 "reset"와 호출하면, 모든 기록란을 기본값으로 설정합니다.

같이 보기: lasterr, error, lastwarn.

[안내, 안내_식별자] = lasterr ()
lasterr (안내)
lasterr (안내, 안내_식별자)

마지막 오류 문구를 조회 또는 설정합니다.

매개변수 없이 호출하면, 마지막 오류 문구와 안내 식별자를 반환합니다.

매개변수 한 개와 호출하면, 마지막 오류 문구를 안내로 설정합니다.

매개변수 두 개와 호출하면, 마지막 오류 문구를 안내로, 오류 문구 식별자를 안내_식별자로 설정합니다.

같이 보기: lasterror, error, lastwarn.

다음 예시는 색인 오류 횟수를 셉니다. 함수 lasterror가 반환하는 구조체의 identifier 기록란으로 오류를 잡습니다.

number_of_errors = 0;
for n = 1:100
  try
    …
  catch
    id = lasterror.identifier;
    if (strcmp (id, "Octave:invalid-indexing"))
      number_of_errors++;
    endif
  end_try_catch
endfor

옥타브와 함께 배포한 함수는 아래 문제를 일으킬 가능성이 있습니다.

Octave:invalid-context

호출한 유효 범위 안에서 명령을 실행할 수 없으면 생기는 오류입니다. 예를 들어, 옥타브 명령 처리기에서 함수 print_usage ()를 호출하면 이 오류가 발생합니다.

Octave:invalid-input-arg

잘못된 입력 매개변수로 함수를 호출하면 생깁니다.

Octave:invalid-fun-call

잘못된 매개변수 개수 등 함수 호출 방법이 잘못되면 생깁니다.

Octave:invalid-indexing

자료형을 잘못 색인하면 생깁니다. 예를 드어, 배열에 실수값 색인을 한다던가 구조체에 없는 기록란을 참조하는 경우입니다.

Octave:bad-alloc

막기억장치에 할당할 수 없으면 생깁니다.

Octave:undefined-function

정의하지 않은 함수를 호출하면 생깁니다. 함수가 존재하더라도 검색 경로에서 못 찾은 것일 수도 있습니다.

오류를 처리하고 나면, 다시 오류를 재현하는 것도 가능합니다. 이는 오류를 잡으면서도 풀그림을 멈출 필요가 있을 때 유용합니다. rethrow 함수를 사용합니다. 이전 예시를 고쳐  ‘*’ 연산자 오류 횟수를 세면서, 다른 종류의 오류에도 작업을 멈추게 만들었습니다.

number_of_errors = 0;
for n = 1:100
  try
    …
  catch
    msg = lasterror.message;
    if (strfind (msg, "operator *"))
      number_of_errors++;
    else
      rethrow (lasterror);
    endif
  end_try_catch
endfor
rethrow (오류)

오류에 정의한 이전 오류를 다시 보여줍니다.

오류는 적어도 반드시 "message""identifier" 기록란이 있는 구조체이어야 합니다. 오류에서 추측되는 오류 위치에 관한 정보를 기록란 "stack"에 넣을 수 있습니다. 보통 오류lasterror가 반환합니다.

같이 보기: lasterror, lasterr, error.

오류 = errno ()
오류 = errno ()
오류 = errno (이름)

체제 기반 변수 번호를 조회 또는 설정합니다.

매개변수 없이 호출하면, 현재 오류 번호 값을 반환합니다.

수치값 과 호출하면, 현재 오류 번호 값을 지정한 값으로 설정합니다. 설정하기 전 오류 번호 값은 오류에 반환합니다.

문자 문자열 이름과 호출하면, 지정한 오류 부호에 맞는 수치값 오류 번호를 반환합니다. 이름이 오류 부호가 아니면, -1을 반환합니다.

같이 보기: errno_list.

errno_list ()

체제 기반 변수 번호 값 여러 개를 담은 구조체를 반환합니다.

같이 보기: errno.


다음: 오류 복구, 이전: 오류 계기, 상위 문서: 오류 다루기   [차례][찾아보기]