Prolog 오류 발생

Prolog 오류 발생

C 함수에서 Prolog 오류를 발생시키는 함수들을 설명해요.

출처: GNU Prolog Manual - Raising Prolog errors

본문

다음 함수들은 C 함수가 Prolog 오류를 발생시킬 수 있게 해줘요. 오류 발생의 효과에 대한 자세한 내용은 Prolog 오류에 관한 절(6.3절)을 참조해요.

오류 컨텍스트 관리

다음 오류 함수 중 하나가 호출될 때 그것은 암시적 오류 컨텍스트(6.3.1절)를 참조해요. 이 컨텍스트는 관련 술어의 이름과 항수를 나타내요. foreign/2 선언을 사용할 때 이 컨텍스트는 기본적으로 연관된 Prolog 술어의 이름과 항수로 설정돼요. 이는 bip_name 옵션(10.3.2절)으로 제어될 수 있어요. 어쨌든 다음 함수들도 이 컨텍스트를 수정하는 데 사용될 수 있어요:

void Pl_Set_C_Bip_Name (const char *functor, int arity)
void Pl_Unset_C_Bip_Name(void)
  • Pl_Set_C_Bip_Name(functor, arity) — functor와 arity로 오류의 컨텍스트를 초기화(arity < 0이면 functor만 의미).
  • Pl_Unset_C_Bip_Name() — 그런 초기화를 제거(컨텍스트는 set_bip_name/2(8.22.3절) 호출이 설정한 마지막 Functor/Arity로 재설정). 이는 이 루틴에서 발생하는 오류에 대한 컨텍스트를 정의하고, 끝나기 전에 이전 컨텍스트를 복원하기 위해 C 루틴을 작성할 때 유용해요.

인스턴스화 오류

다음 함수는 인스턴스화 오류(6.3.2절)를 발생시켜요:

void Pl_Err_Instantiation(void)

비인스턴스화 오류

다음 함수는 비인스턴스화 오류(6.3.3절)를 발생시켜요:

void Pl_Err_Uninstantiation(PlTerm culprit)

유형 오류

다음 함수는 유형 오류(6.3.4절)를 발생시켜요:

void Pl_Err_Type(int atom_type, PlTerm culprit)

atom_type은 기대된 유형과 연관된 (내부 키의) 원자예요. 각 유형 이름 T에 대해 이름이 pl_type_T 형태인 전역 변수에 저장된 대응하는 미리 정의된 원자가 있어요. culprit는 오류를 일으킨 인자예요.

예: x가 원자인데 정수가 기대됨:

Pl_Err_Type(pl_type_integer, x);

도메인 오류

다음 함수는 도메인 오류(6.3.5절)를 발생시켜요:

void Pl_Err_Domain(int atom_domain, PlTerm culprit)

atom_domain은 기대된 도메인과 연관된 (내부 키의) 원자예요. 각 도메인 이름 D에 대해 이름이 pl_domain_D 형태인 전역 변수에 저장된 대응하는 미리 정의된 원자가 있어요. culprit는 오류를 일으킨 인자예요.

예: x가 0보다 작지만 0보다 크거나 같아야 함:

Pl_Err_Domain(pl_domain_not_less_than_zero, x);

존재 오류

다음 함수는 존재 오류(6.3.6절)를 발생시켜요:

void Pl_Err_Existence(int atom_object, PlTerm culprit)

atom_object는 객체의 유형과 연관된 (내부 키의) 원자예요. 각 객체 이름 O에 대해 이름이 pl_existence_O 형태인 전역 변수에 저장된 대응하는 미리 정의된 원자가 있어요. culprit는 오류를 일으킨 인자예요.

예: x가 기존 소스를 가리키지 않음:

Pl_Err_Existence(pl_existence_source_sink, x);

권한 오류

다음 함수는 권한 오류(6.3.7절)를 발생시켜요:

void Pl_Err_Permission(int atom_operation, int atom_permission, PlTerm culprit)

atom_operation은 오류를 일으킨 연산과 연관된 (내부 키의) 원자예요. 각 연산 이름 O에 대해 이름이 pl_permission_operation_O 형태인 전역 변수에 저장된 대응하는 미리 정의된 원자가 있어요. atom_permission은 시도된 권한과 연관된 (내부 키의) 원자예요. 각 권한 이름 P에 대해 이름이 pl_permission_type_P 형태인 전역 변수에 저장된 대응하는 미리 정의된 원자가 있어요. culprit는 오류를 일으킨 인자예요.

예: 출력 스트림 x에서 읽기:

Pl_Err_Permission(pl_permission_operation_input, pl_permission_type_stream, x);

표현 오류

다음 함수는 표현 오류(6.3.8절)를 발생시켜요:

void Pl_Err_Representation(int atom_limit)

atom_limit은 도달된 한계와 연관된 (내부 키의) 원자예요. 각 한계 이름 L에 대해 이름이 pl_representation_L 형태인 전역 변수에 저장된 대응하는 미리 정의된 원자가 있어요.

예: 너무 큰 항수가 발생:

Pl_Err_Representation(pl_representation_max_arity);

평가 오류

다음 함수는 평가 오류(6.3.9절)를 발생시켜요:

void Pl_Err_Evaluation(int atom_error)

atom_error는 오류와 연관된 (내부 키의) 원자예요. 각 평가 오류 이름 E에 대해 이름이 pl_evaluation_E 형태인 전역 변수에 저장된 대응하는 미리 정의된 원자가 있어요.

예: 0으로 나누기가 발생:

Pl_Err_Evaluation(pl_evaluation_zero_divisor);

자원 오류

다음 함수는 자원 오류(6.3.10절)를 발생시켜요:

void Pl_Err_Resource(int atom_resource)

atom_resource는 자원과 연관된 (내부 키의) 원자예요. 각 자원 오류 이름 R에 대해 이름이 pl_resource_R 형태인 전역 변수에 저장된 대응하는 미리 정의된 원자가 있어요.

예: 너무 많은 열린 스트림:

Pl_Err_Resource(pl_resource_too_many_open_streams);

구문 오류

다음 함수는 구문 오류(6.3.11절)를 발생시켜요:

void Pl_Err_Syntax(int atom_error)

atom_error는 오류와 연관된 (내부 키의) 원자예요. 미리 정의된 구문 오류 원자는 없어요.

예: /가 기대됨:

Pl_Err_Syntax(Pl_Create_Atom("/ expected"));

다음 함수는 syntax_error Prolog 플래그(8.22.1절)의 값에 따라 구문 오류를 발생시켜요. 이 함수는 그런 다음 반환할 수 있어요(플래그 값이 warning 또는 fail이면). 그 경우 호출 함수는 실패해야 해요(예: PL_FALSE 반환). 이 함수는 파일 이름(빈 문자열 C ""을 전달할 수 있음), 줄과 열 번호, 오류 메시지 문자열을 받아요. 이 함수를 사용하면 내장 술어 syntax_error_info/4(8.14.4절)를 더 호출할 수 있게 돼요:

void Pl_Emit_Syntax_Error(char *file_name, int line, int column, char *message)

예: /가 기대됨:

Pl_Emit_Syntax_Error("data", 10, 30, "/ expected");

시스템 오류

다음 함수는 시스템 오류(4.3.11)를 발생시켜요:

void Pl_Err_System(int atom_error)

atom_error는 오류와 연관된 (내부 키의) 원자예요. 미리 정의된 시스템 오류 원자는 없어요.

예: 유효하지 않은 경로명이 주어짐:

Pl_Err_System(Pl_Create_Atom("invalid path name"));

다음 함수는 os_error Prolog 플래그(8.22.1절)의 값에 따라 운영체제 오류와 연관된 시스템 오류를 발생시켜요. 이 함수는 그런 다음 반환할 수 있어요(플래그 값이 warning 또는 fail이면). 그 경우 호출 함수는 실패해야 해요(예: PL_FALSE 반환). 다음 함수는 C 라이브러리 변수 errno의 값을 사용해요(기본적으로 strerror(errno)의 결과로 Pl_Err_System을 호출):

void Pl_Os_Error(void)

예: C Unix 함수 chdir(2) 호출이 -1을 반환하면 Pl_Os_Error()를 호출해요.

더 알아보기