Prolog 오류 발생
Prolog 오류 발생
C 함수에서 Prolog 오류를 발생시키는 함수들을 설명해요.
본문
다음 함수들은 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()를 호출해요.