디시인사이드 갤러리

갤러리 이슈박스, 최근방문 갤러리

갤러리 본문 영역

러빨럼들 눈돌아갈 Ada의 예외처리와 언어 정의 검사들

나르시갤로그로 이동합니다. 2025.09.02 04:45:55
조회 84 추천 0 댓글 0

아직 초안입니다. Ada 2022 레퍼런스 매뉴얼을 기반으로 작성하였습니다.



6. 예외 처리

프로그램 실행 중에는 파일 누락, 메모리 부족, 무효한 연산 등 정상적인 실행 흐름을 방해하는 예외적인 상황이 발생할 수 있습니다. Ada는 이러한 상황을 다루기 위한 예외 처리 메커니즘을 언어 차원에서 제공합니다.

예외 처리는 오류 감지 부분과 오류 처리 부분을 분리하여 프로그램의 신뢰성과 명확성을 높이는 데 기여합니다.

6.1 예외의 개념과 종류

예외(exception)는 정상적인 프로그램 실행을 중단시키는 예외적 상황을 나타냅니다. 이러한 상황이 발생하는 것을 예외를 발생시킨다(raise)라고 하며, 발생된 예외에 대응하는 코드를 실행하는 것을 예외를 처리한다(handle)라고 합니다.

Ada의 예외는 두 가지로 나뉩니다.

6.1.1 미리 정의된 예외와 런타임 검사

언어 표준에 미리 정의된 예외들은 특정 런타임 검사(language-defined check)가 실패할 때 자동으로 발생합니다. 각 미리 정의된 예외와 관련된 검사 항목은 다음과 같습니다.

Constraint_Error 관련 검사 (8종류)
  1. Access_Check: 널(null) 포인터에 대한 역참조를 검사합니다.
  2. Discriminant_Check: 레코드의 판별자(discriminant) 제약 조건 위반을 검사합니다.
  3. Division_Check: 0으로 나누는 연산을 검사합니다.
  4. Index_Check: 배열의 인덱스 범위를 벗어나는 접근을 검사합니다.
  5. Length_Check: 배열 간 연산 또는 변환 시 길이가 일치하는지 검사합니다.
  6. Overflow_Check: 연산 결과가 스칼라 타입의 기본 범위를 초과하는지 검사합니다.
  7. Range_Check: 스칼라 값이 특정 서브타입의 범위 제약을 만족하는지 검사합니다.
  8. Tag_Check: 태그된(tagged) 타입의 태그가 연산에 적합한지 검사합니다.
Program_Error 관련 검사 (4종류)
  1. Accessibility_Check: 접근성(accessibility) 규칙 위반을 검사합니다.
  2. Allocation_Check: 메모리 할당 시점의 유효성을 검사합니다.
  3. Elaboration_Check: 프로그램 유닛의 본문이 실행(elaborate)되기 전 호출되는지 검사합니다.
  4. Program_Error_Check: 위에 해당하지 않는 기타 프로그램 논리 오류들을 검사합니다.
Storage_Error 관련 검사 (1종류)
  1. Storage_Check: 메모리 풀의 공간이나 태스크의 스택 공간이 초과되는지 검사합니다.
Tasking_Error 관련 검사 (1종류)
  1. Tasking_Check: 태스크 활성화 실패나 종료된 태스크 호출 등을 검사합니다.
Assertion_Error 관련 검사 (8종류)

표준 라이브러리 패키지와 관련된 단정문(assertion) 위반을 검사합니다.

  1. Calendar_Assertion_Check
  2. Characters_Assertion_Check
  3. Containers_Assertion_Check
  4. Interfaces_Assertion_Check
  5. IO_Assertion_Check
  6. Numerics_Assertion_Check
  7. Strings_Assertion_Check
  8. System_Assertion_Check

6.1.2 사용자 정의 예외

프로그래머가 특정 상황을 표현하기 위해 직접 선언하는 예외입니다. 애플리케이션의 특정 오류 조건(예: Insufficient_Funds, Invalid_Sensor_Value)을 명시적으로 나타내는 데 사용됩니다.

6.2 예외 선언 및 발생

사용자 정의 예외는 exception 키워드를 통해 선언합니다.

문법:

Exception_Name : exception;

예시:

Invalid_Input : exception;
Sensor_Failure, Communication_Error : exception;

선언된 예외 또는 미리 정의된 예외는 raise 문을 사용하여 의도적으로 발생시킬 수 있습니다.

문법:

raise Exception_Name;
raise Exception_Name with "Error message";

with 절을 사용하면 예외 발생 시 특정 메시지를 함께 전달할 수 있습니다.

예시:

if user_input < 0 then
  raise Invalid_Input;
end if;

if sensor_reading > threshold then
  raise Sensor_Failure with "Sensor #" & id'image & " exceeds threshold";
end if;

6.3 예외 처리 구문

예외 처리는 begin-end 블록의 exception 부분에 위치하는 예외 핸들러(exception handler)를 통해 이루어집니다.

문법:

begin
  -- 보호하고자 하는 정상 실행 코드
  ...
exception
  when Exception_Name_1 =>
    -- Exception_Name_1 처리 코드
  when Exception_Name_2 | Exception_Name_3 =>
    -- Exception_Name_2 또는 3 처리 코드
  when others =>
    -- 위에 명시되지 않은 모든 예외 처리 코드
end;
  • when <예외 이름> =>: 특정 예외를 처리합니다.
  • | 기호: 여러 예외를 하나의 핸들러에서 처리할 수 있습니다.
  • when others =>: 특정되지 않은 모든 종류의 예외를 처리합니다. 이 핸들러는 항상 마지막에 위치해야 합니다.

예시:

begin
   value := Integer'value (user_input);
   result := 100 / value;
exception
   when Constraint_Error =>
      put_line ("Invalid number format or division by zero.");
   when others =>
      put_line ("An unknown error occurred.");
end;

6.4 예외 전파와 다시 발생시키기

특정 begin-end 블록 내에서 예외가 발생했지만 처리할 수 있는 핸들러가 없거나, exception 절 자체가 없는 경우, 해당 예외는 전파(propagate)됩니다.

예외 전파는 현재 실행 중인 서브프로그램을 즉시 종료하고, 해당 서브프로그램을 호출한 지점(caller)으로 예외를 다시 발생시키는 방식으로 이루어집니다. 이러한 과정은 적절한 예외 핸들러를 만나거나 태스크의 최상위 수준에 도달할 때까지 호출 스택을 따라 계속됩니다.

때로는 예외를 처리하는 도중에 현재 예외를 그대로 상위 호출자로 다시 전파시켜야 할 필요가 있습니다. 예를 들어, 오류를 로그에 기록한 후 상위 수준에서 추가적인 복구 작업을 하도록 하는 경우입니다. 이때 매개변수가 없는 raise 문을 사용합니다.

begin
  process_data (sensor_data);
exception
  when e : Sensor_Failure =>
    log_error ("Sensor failed: " & exception_message (e));
    raise; -- 처리 중인 예외(e)를 호출자로 다시 전파
end;

6.5 예외 정보 얻기: Ada.Exceptions

예외가 발생했을 때 더 상세한 정보를 얻기 위해, Ada는 Ada.Exceptions 라는 표준 라이브러리 패키지를 제공합니다. 예외 핸들러에서 선택적 매개변수(choice parameter)를 사용하면 발생한 예외에 대한 정보를 담고 있는 Exception_Occurrence 타입의 객체에 접근할 수 있습니다.

예시:

with Ada.Text_IO, Ada.Exceptions;
use  Ada.Text_IO, Ada.Exceptions;

...

begin
  -- 예외 발생 가능성이 있는 코드
exception
  when e : others =>  -- e는 Exception_Occurrence 타입의 객체
    put_line ("Error Information");
    put_line ("Name: "    & exception_name        (e));
    put_line ("Message: " & exception_message     (e));
    put_line ("Trace: "   & exception_information (e));
end;
  • exception_name (e): 예외의 이름을 문자열로 반환합니다 (예: "CONSTRAINT_ERROR").
  • exception_message (e): raise ... with "message" 구문으로 전달된 메시지를 반환합니다.
  • exception_information (e): 예외 이름, 메시지, 발생 위치의 콜 스택 추적(stack trace) 등 상세한 정보를 포함한 문자열을 반환합니다.

추천 비추천

0

고정닉 0

0

댓글 영역

전체 댓글 0
본문 보기

하단 갤러리 리스트 영역

왼쪽 컨텐츠 영역

갤러리 리스트 영역

갤러리 리스트
번호 제목 글쓴이 작성일 조회 추천
설문 순간의 말실수로 이미지 타격이 큰 것 같은 스타는? 운영자 25/09/01 - -
AD 신학기 레벨업~!! 운영자 25/09/05 - -
2887140 카페 왔는데 [4] 아스카영원히사랑해갤로그로 이동합니다. 09.06 91 0
2887139 드라마 <퍼스트레이디> 한대서 생각나는 예전 글 발명도둑잡기(118.216) 09.06 47 0
2887138 컴퓨터가 체스, 바둑, 스타는 정복했는데 [3] ㅋㅋ(211.224) 09.06 52 0
2887136 상해죄 벌금 50만원으로 취업 될게 안되기도 하나요?? ㅇㅇ(223.38) 09.06 27 0
2887132 긴급) 나님 한강뛰뛰 크루 회동 ♥냥덩삣삐♥갤로그로 이동합니다. 09.06 64 0
2887131 [속보] 대도서관 사망설…본인 연락두절 [1] 발명도둑잡기(118.216) 09.06 86 0
2887129 메이드카페 가보니까 하루종일 발기가 멈추질 않더라고 [3] 메쿠이료갤로그로 이동합니다. 09.06 78 0
2887127 솔직히 승윤이 윤택이도 달에 천만원이상 버는데 [4] 뒷통수한방(1.213) 09.06 59 1
2887119 나랑 동거하는 여친 사진 찍어봤는데 어떠냐 [2] 메쿠이료갤로그로 이동합니다. 09.06 81 0
2887116 나님 끙야로 배 비우기 ㅇㅅㅇ ♥냥덩삣삐♥갤로그로 이동합니다. 09.06 38 0
2887111 근데 노인들 권력있고 돈많은자들끼리 카르텔형성하고 모여다니는거 [5] 뒷통수한방(1.213) 09.06 49 0
2887105 민주당 지지안하면 참수시켜야됨 [1] 류류(118.235) 09.06 48 1
2887099 나님 소화되면 운덩이나 하구올깡 ♥냥덩삣삐♥갤로그로 이동합니다. 09.06 45 0
2887098 신발깔창이 벗겨졌다 샌들 넥도리아(223.38) 09.06 28 0
2887094 날씨 언제 시원해지냐 ㅇㅅㅇ 류류(118.235) 09.06 24 0
2887091 자연인 승윤이 윤택이도 노인때묻어서 월천에 보너스도 몇백 버네 ㅋㅋㅋ 뒷통수한방(1.213) 09.06 20 0
2887090 한국인 300여명 체포, 민주노총 “미국의 횡포 규탄한다” 발명도둑잡기(118.216) 09.06 26 0
2887087 피궁해서 암것두 못하겠당 ♥냥덩삣삐♥갤로그로 이동합니다. 09.06 39 0
2887084 의외로 경찰이 하는 일 발명도둑잡기(118.216) 09.06 46 0
2887081 러빨러의 러빰 행위는 중단된 것일까요? 나르시갤로그로 이동합니다. 09.06 21 0
2887080 아스카 강북 여행 중 [1] 아스카영원히사랑해갤로그로 이동합니다. 09.06 60 0
2887066 도메인에서 싱글톤인데, 데이터 레이어에서 저장을 위해 id가 필요한 상황 프갤러(180.226) 09.06 26 0
2887064 더불어민주당 최강욱 국민학살 망언 미국에도 퍼지다 ♥냥덩삣삐♥갤로그로 이동합니다. 09.06 40 0
2887063 배민 반찬 구성이 써있는거랑 다르면 별점 1점사유 아니냐 ㅇㅅㅇ?? ㅇㅇ(223.38) 09.06 29 0
2887060 오늘도 평화로운 중고나라 현장 ㅇㅇㅇㅇ(115.144) 09.06 22 0
2887052 진보당, 당선된 국회의원 일 못하면 자르는 법 입법 [4] 발명도둑잡기(118.216) 09.06 36 0
2887046 친구가 안양으로 올라오는데 비와서 걱정중... [6] 넥도리아(220.74) 09.06 52 0
2887044 나님의 강점은 ♥냥덩삣삐♥갤로그로 이동합니다. 09.06 29 0
2887043 [대한민국] 민주주이란? 그리고 미 - 현대차 한국인 체포 - [1] 프갤러(121.172) 09.06 40 0
2887042 자연인 승윤이 윤택이도 노인때묻어서 월천에 보너스도 몇백 버네 ㅋㅋㅋ 뒷통수한방(1.213) 09.06 29 0
2887041 다들 착각하는데 아직도 극초창기임 ♥냥덩삣삐♥갤로그로 이동합니다. 09.06 48 0
2887040 주말은 푹 쉬자고~ 프갤러(61.79) 09.06 30 0
2887039 ㄹㅇ 애널은 푹 쉬어야징 ♥냥덩삣삐♥갤로그로 이동합니다. 09.06 56 0
2887038 가짜 518광주 유공자 명단공개 전수조사 필요성 [2] ♥냥덩삣삐♥갤로그로 이동합니다. 09.06 44 0
2887037 애플 이벤트 D - 4 ㅇㅅㅇ 헤르 미온느갤로그로 이동합니다. 09.06 33 0
2887036 태연 ㅇㅅㅇ 헤르 미온느갤로그로 이동합니다. 09.06 32 0
2887035 하루 한 번 헤르미온느 찬양 헤르 미온느갤로그로 이동합니다. 09.06 49 0
2887034 상위 0.6% ♥냥덩삣삐♥갤로그로 이동합니다. 09.06 54 0
2887033 ❤✨☀⭐⚡☘⛩나님 시작합니당⛩☘⚡⭐☀✨❤ ♥냥덩삣삐♥갤로그로 이동합니다. 09.06 31 0
2887032 신입을 가르치고 교육 시켜도 되는 이유. 프갤러(59.16) 09.06 67 0
2887031 세계 중앙은행 금 보유량이 미국 국채 보유량을 넘어서다 [1] 발명도둑잡기(118.216) 09.06 58 0
2887030 이제 시스템 전원을 끄셔도 됩니다 발명도둑잡기(118.216) 09.06 46 0
2887029 여사친 어카냐 요리루갤로그로 이동합니다. 09.06 82 0
2887028 넷플릭스가 모태솔로 프로그램을 그렇게 만들수밖에 없던 이유 발명도둑잡기(118.216) 09.06 58 0
2887027 음기 충전 발명도둑잡기(118.216) 09.06 73 0
2887026 자연인 승윤이 윤택이도 노인때묻어서 월천에 보너스도 몇백 버네 ㅋㅋㅋ 뒷통수한방(1.213) 09.06 42 0
2887025 제일 이해가 안가는게 지가 못해서 의뢰를 했으면 [4] ㅆㅇㅆ(124.216) 09.06 108 0
2887024 무릎 통증이 심각하다 무슨 과 무슨병원 [1] 넥도리아(119.195) 09.06 49 0
2887023 좆밥련이 모르면 씨발 알려줘서 감사합니다 이러지 개좆같게 구노 ㅆㅇㅆ(124.216) 09.06 59 0
2887022 하 씨이이발 경력만 10년 15년인 새끼가 쳐 몰라가지고 ㅋㅋㅋ [2] ㅆㅇㅆ(124.216) 09.06 105 0
뉴스 ‘신부 비공개’ 김종국, ‘극비 결혼식’ 다음날 SNS에 올린 사진 디시트렌드 14:00
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2