오류

오류

오류가 발생하면 예외가 제기되고, 다양한 종류의 오류와 그 처리 방법을 설명해요.

출처: GNU Prolog Manual - Errors

본문

다음은 이 절에서 다루는 내용 목록이에요:

  • 일반 형식과 오류 문맥
  • 인스턴스화 오류
  • 비인스턴스화 오류
  • 타입 오류
  • 도메인 오류
  • 존재 오류
  • 권한 오류
  • 표현 오류
  • 평가 오류
  • 자원 오류
  • 구문 오류
  • 시스템 오류

일반 형식과 오류 문맥

오류가 발생하면 다음 형태의 예외가 제기돼요:

error(ErrorTerm, Caller)

ErrorTerm은 오류를 지정하는 항(다음 절들에서 상세히 설명)이고, Caller는 오류의 문맥을 지정하는 항이에요. 문맥은 마지막으로 호출된 내장 술어의 술어 표시자 또는 일반 문맥 정보를 주는 원자예요.

예외를 사용하면 사용자는 catch/3(7.2.4절)으로 오류를 복구하고 throw/1(7.2.4절)로 오류를 제기할 수 있어요.

오류 케이스를 어떻게 작성하는지 설명하기 위해, X가 정수여야 하는 술어 my_pred(X)를 작성해 보아요:

my_pred(X) :-
    ( nonvar(X) ->
        true
    ; throw(error(instantiation_error, my_pred/1)),
    ),
    ( integer(X) ->
        true
    ; throw(error(type_error(integer, X), my_pred/1))
    ),
    ...

사용자가 이 오류 케이스를 작성하는 데 도움을 주기 위해 오류를 제기하는 시스템 술어 집합이 제공돼요. 이 술어들은 '$pl_err_...' 형태이며 모두 암시적 오류 문맥을 참조해요. 술어 set_bip_name/2(8.22.3절)와 current_bip_name/2(8.22.4절)는 이 문맥과 연관된 이름과 아리티를 설정하고 복구하도록 제공돼요(아리티 < 0은 functor에 해당하는 원자만 중요함을 의미).

이 시스템 술어들을 사용하면 위 술어를 다음과 같이 정의할 수 있어요:

my_pred(X) :-
    set_bip_name(my_pred,1),
    ( nonvar(X) ->
        true
    ; '$pl_err_instantiation'
    ),
    ( integer(X) ->
        true
    ; '$pl_err_type'(integer, X)
    ),
    ...

다음 절들은 각 종류의 오류(및 관련 시스템 술어)를 상세히 설명해요.

인스턴스화 오류(Instantiation error)

인스턴스화된 인자가 기대되는데 인자 또는 그 구성 요소가 변수일 때 인스턴스화 오류가 발생해요.

ErrorTerm은 다음 형태를 가져요: instantiation_error.

시스템 술어 '$pl_err_instantiation'은 현재 오류 문맥(6.3.1절)에서 이 오류를 제기해요.

비인스턴스화 오류(Uninstantiation error)

변수 또는 변수인 구성 요소가 요구되는데 인자 또는 그 구성 요소가 변수가 아닐 때 비인스턴스화 오류가 발생해요.

ErrorTerm은 다음 형태를 가져요: uninstantiation_error(Culprit). 여기서 Culprit는 오류를 일으킨 인자 또는 그 구성 요소예요.

시스템 술어 '$pl_err_uninstantiation'(Culprit)은 현재 오류 문맥(6.3.1절)에서 이 오류를 제기해요.

타입 오류(Type error)

인자 또는 그 구성 요소의 타입이 기대한 타입이 아닐 때(그러나 변수는 아닐 때) 타입 오류가 발생해요.

ErrorTerm은 다음 형태를 가져요: type_error(Type, Culprit). 여기서 Type은 기대한 타입이고 Culprit는 오류를 일으킨 인자예요.

Type은 다음 중 하나예요: atom, atomic, boolean, byte, callable, character, compound, evaluable, fd_bool_evaluable, fd_evaluable, fd_variable, float, in_byte, in_character, integer, list, number, pair, predicate_indicator

시스템 술어 '$pl_err_type'(Type, Culprit)은 현재 오류 문맥(6.3.1절)에서 이 오류를 제기해요.

도메인 오류(Domain error)

인자의 타입은 올바르지만 그 값이 기대한 도메인 밖에 있을 때 도메인 오류가 발생해요.

ErrorTerm은 다음 형태를 가져요: domain_error(Domain, Culprit). 여기서 Domain은 기대한 도메인이고 Culprit는 오류를 일으킨 인자예요.

Domain은 다음 중 하나예요: atom_property, buffering_mode, character_code_list, close_option, date_time, eof_action, fd_labeling_option, flag_value, format_control_sequence, g_array_index, io_mode, non_empty_list, not_less_than_zero, operator_priority, operator_specifier, order, os_file_permission, os_file_property, os_path, predicate_property, prolog_flag, read_option, selectable_item, socket_address, socket_domain, source_sink, statistics_key, statistics_value, stream, stream_option, stream_or_alias, stream_position, stream_property, stream_seek_method, stream_type, term_stream_or_alias, var_binding_option, write_option

시스템 술어 '$pl_err_domain'(Domain, Culprit)은 현재 오류 문맥(6.3.1절)에서 이 오류를 제기해요.

존재 오류(Existence error)

연산을 수행할 객체가 존재하지 않을 때 존재 오류가 발생해요.

ErrorTerm은 다음 형태를 가져요: existence_error(Object, Culprit). 여기서 Object는 객체의 타입이고 Culprit는 오류를 일으킨 인자예요.

Object는 다음 중 하나예요: procedure, source_sink, stream.

시스템 술어 '$pl_err_existence'(Object, Culprit)은 현재 오류 문맥(6.3.1절)에서 이 오류를 제기해요.

권한 오류(Permission error)

금지된 연산을 수행하려는 시도가 있을 때 권한 오류가 발생해요.

ErrorTerm은 다음 형태를 가져요: permission_error(Operation, Permission, Culprit). 여기서 Operation은 오류를 일으킨 연산이고, Permission은 시도된 권한의 유형이며, Culprit는 오류를 일으킨 인자예요.

Operation은 다음 중 하나예요: access, add_alias, close, create, input, modify, open, output, reposition.

Permission은 다음 중 하나예요: binary_stream, flag, operator, past_end_of_stream, private_procedure, source_sink, static_procedure, stream, text_stream.

시스템 술어 '$pl_err_permission'(Operation, Permission, Culprit)은 현재 오류 문맥(6.3.1절)에서 이 오류를 제기해요.

표현 오류(Representation error)

구현 한계를 넘었을 때 표현 오류가 발생해요.

ErrorTerm은 다음 형태를 가져요: representation_error(Limit). 여기서 Limit은 도달한 한계의 이름이에요.

Limit은 다음 중 하나예요: character, character_code, in_character_code, max_arity, max_integer, min_integer, integer_32bits, too_many_variables.

오류 max_integermin_integer는 현재 구현되어 있지 않아요.

시스템 술어 '$pl_err_representation'(Limit)은 현재 오류 문맥(6.3.1절)에서 이 오류를 제기해요.

평가 오류(Evaluation error)

산술 표현식이 예외적인 값을 만들어낼 때 평가 오류가 발생해요.

ErrorTerm은 다음 형태를 가져요: evaluation_error(Error). 여기서 Error는 오류의 이름이에요.

Error는 다음 중 하나예요: float_overflow, int_overflow, undefined, underflow, zero_divisor.

오류 float_overflow, int_overflow, undefined, underflow는 현재 구현되어 있지 않아요.

시스템 술어 '$pl_err_evaluation'(Error)은 현재 오류 문맥(6.3.1절)에서 이 오류를 제기해요.

자원 오류(Resource error)

GNU Prolog에 충분한 자원이 없을 때 자원 오류가 발생해요.

ErrorTerm은 다음 형태를 가져요: resource_error(Resource). 여기서 Resource는 자원의 이름이에요.

Resource는 다음 중 하나예요: print_object_not_linked, too_big_fd_constraint.

시스템 술어 '$pl_err_resource'(Resource)은 현재 오류 문맥(6.3.1절)에서 이 오류를 제기해요.

구문 오류(Syntax error)

문자 시퀀스가 항의 구문을 따르지 않을 때 구문 오류가 발생해요.

ErrorTerm은 다음 형태를 가져요: syntax_error(Error). 여기서 Error는 오류를 설명하는 원자예요.

시스템 술어 '$pl_err_syntax'(Error)은 현재 오류 문맥(6.3.1절)에서 이 오류를 제기해요.

시스템 오류(System error)

시스템 오류는 어느 단계에서나 발생할 수 있어요. 시스템 오류는 일반적으로 외부 구성 요소(예: 운영체제)와 연관돼요.

ErrorTerm은 다음 형태를 가져요: system_error(Error). 여기서 Error는 오류를 설명하는 원자예요. 이는 인자 없는 system_error만을 정의하는 ISO에 대한 확장이에요.

시스템 술어 '$pl_err_system'(Error)은 현재 오류 문맥(6.3.1절)에서 이 오류를 제기해요.

더 알아보기