오류
오류
오류가 발생하면 예외가 제기되고, 다양한 종류의 오류와 그 처리 방법을 설명해요.
본문
다음은 이 절에서 다루는 내용 목록이에요:
- 일반 형식과 오류 문맥
- 인스턴스화 오류
- 비인스턴스화 오류
- 타입 오류
- 도메인 오류
- 존재 오류
- 권한 오류
- 표현 오류
- 평가 오류
- 자원 오류
- 구문 오류
- 시스템 오류
일반 형식과 오류 문맥
오류가 발생하면 다음 형태의 예외가 제기돼요:
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_integer와 min_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절)에서 이 오류를 제기해요.