디시인사이드 갤러리

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

갤러리 본문 영역

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

나르시갤로그로 이동합니다. 2025.09.02 04:45:55
조회 92 추천 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/08 - -
AD 신학기 레벨업~!! 운영자 25/09/05 - -
2887823 잠든 사이 20만 원 소액결제…무슨 일이? [1] 발명도둑잡기(118.216) 09.08 32 0
2887821 강릉 시민들은 더 고통받아야한다 [5] 야옹아저씨갤로그로 이동합니다. 09.08 64 7
2887815 코딩용 노트북 쓸 때 리눅스 따로 깜? [1] ㅇㅇ갤로그로 이동합니다. 09.08 57 0
2887814 너네들 핸드폰할 때 회사 와이파이 쓰냐???? [1] 이시꾸갤로그로 이동합니다. 09.08 33 0
2887809 미군 위안부 117분이 소송에 나섰습니다 발명도둑잡기(118.216) 09.08 17 0
2887807 정말 개똥같은 조직이야 프갤러(110.8) 09.08 21 0
2887806 애널의달성 2///3 ♥뽀송냥덩♥갤로그로 이동합니다. 09.08 59 0
2887792 인생 정답 내 닉보면 알수있잖누 타이밍뒷통수한방(1.213) 09.08 19 0
2887788 트럼프, 중국은 부담스러웠나…인도에는 관세 때리더니 중국엔 '관세 유예 발명도둑잡기(118.216) 09.08 33 0
2887786 미국서 건설 중인 공장 22곳…"일단 철수" 한국 기업 비상 발명도둑잡기(118.216) 09.08 24 0
2887781 "한국에선 영화가 현실로" 해외 누리꾼 감탄시킨 홀로그램 경찰관 발명도둑잡기(118.216) 09.08 21 0
2887777 클로로 VS 히소카 ♥뽀송냥덩♥갤로그로 이동합니다. 09.08 28 0
2887775 mbti 걍 mvm mvc mvvm 같은거지 [1] 뉴진파갤로그로 이동합니다. 09.08 31 0
2887772 다들 답도 없는 인생을 어떻게 사는거냐. 나만 미치겠냐?? [2] ㅇㅇ(223.38) 09.08 45 0
2887770 리액트 튜토리얼 잘돼잇더라 [2] 헬마스터갤로그로 이동합니다. 09.08 53 0
2887769 나님 감기 느낌적인 느낌.. ♥뽀송냥덩♥갤로그로 이동합니다. 09.08 45 0
2887767 월세 밀린 60대 세입자, 집주인 피하려다···아파트 4층에서 추락사 발명도둑잡기(118.216) 09.08 23 0
2887766 일본은 15% 한국은 친중재명 때문에 25% 관세폭탄 [2] ♥뽀송냥덩♥갤로그로 이동합니다. 09.08 31 0
2887764 친중재명 손절 당하고 불법체류 추방 [1] ♥뽀송냥덩♥갤로그로 이동합니다. 09.08 28 0
2887762 페퍼톤스, 청춘의 노래로 페스티벌 달궜다 발명도둑잡기(118.216) 09.08 18 0
2887757 망해가는 짱깨 [1] ♥뽀송냥덩♥갤로그로 이동합니다. 09.08 29 0
2887751 여자들 mbti에 왜 미쳐있는거냐 [6] 헬마스터갤로그로 이동합니다. 09.08 57 0
2887750 “라면으로 중증장애인 끼니 때워라.” 발명도둑잡기(118.216) 09.08 16 0
2887743 토이프로젝트 깨작깨작해야하는데 [2] 밀우갤로그로 이동합니다. 09.08 41 0
2887742 슬슬 때가 온당.. ♥뽀송냥덩♥갤로그로 이동합니다. 09.08 22 0
2887741 진짜 가르쳐 주기 싫은데 어쩔 수가 없다. 프갤러(59.16) 09.08 34 0
2887739 진짜 경력자란 놈이 만든 코드 보면 줘 패고 싶다. [3] 프갤러(59.16) 09.08 76 0
2887736 ‘여행 유튜버’ 곽튜브, 돌연 10월 결혼 발표…이런 이유가? 발명도둑잡기(118.216) 09.08 33 0
2887734 나만 한녀가 더 좋냐... [5] ㅆㅇㅆ(124.216) 09.08 81 0
2887729 객체 지향 자체가 참 오묘하다 루도그담당(58.239) 09.08 56 0
2887728 c질문해도 되요? [13] 7월갤로그로 이동합니다. 09.08 97 0
2887726 그냥 상위개념을 추출하고, 하위개념을 얼마나 세부구현하는가로 이해해야함 [1] ㅆㅇㅆ(124.216) 09.08 60 0
2887725 윤서인이 더 좋다. 사람 정치만 빼고 애기하면 괜찮다. [1] 넥도리아(220.74) 09.08 30 0
2887724 미국인 너무 싫다. 파랭이 넘 싫다. 혐오병 덩어리 넥도리아(220.74) 09.08 22 0
2887723 그 때 우리 사랑은 트럼프와 한국은... 넥도리아(220.74) 09.08 21 0
2887722 근데 어제 둥둥 게이가 말한거 [4] 루도그담당(58.239) 09.08 79 0
2887721 납품할 RAG 시스템 어떠냐? [5] ㅆㅇㅆ(124.216) 09.08 62 0
2887720 곽튜브 혼전임신 결혼하네 ㄹㅇ; [1] ㅇㅇ(211.177) 09.08 64 1
2887719 저장용 ♥뽀송냥덩♥갤로그로 이동합니다. 09.08 21 0
2887718 머메이드로 그냥 자기가 만들고자하는 오픈소스 클래스 연결짜봐라 [2] ㅆㅇㅆ(124.216) 09.08 45 0
2887717 인생 개좇같이사는애들이 더 잘사는게 우연일까??? [1] 뒷통수한방(1.213) 09.08 35 0
2887716 석박사 논문재현 같은건 인맥 타야함. ㅆㅇㅆ(124.216) 09.08 28 0
2887715 홍혜걸, 여에스더 우울증 증세 고백 "한 줄 답장조차 힘들어" 발명도둑잡기(118.216) 09.08 27 0
2887712 “한국, 일본에 버릇없이 굴잖아”…日 유력 차기 총리의 인식 수준 충격 발명도둑잡기(118.216) 09.08 31 0
2887711 구현은 거의 암기임. 이게 응용보다는 암기인게... [5] ㅆㅇㅆ(124.216) 09.08 62 0
2887710 일본 일상 사진 [1] 프로외노자갤로그로 이동합니다. 09.08 41 0
2887709 인구도86억인구인데 심지어 악마새끼들이 더 잘삼 ㅋㅋㅋ 뒷통수한방(1.213) 09.08 20 0
2887708 뉴프로 고맙습니다 [7] ㅆㅇㅆ찡갤로그로 이동합니다. 09.08 62 0
2887707 친일파, 친미파 시인 서정주 자화상 발명도둑잡기(118.216) 09.08 24 0
2887706 빈부격차가 심해지면 진보주의자가 아무리 정치를 잘 해도 발명도둑잡기(118.216) 09.08 19 0
뉴스 “매일 술 마셔” 김영광-이영애, 맥주 먹방 부른 ‘번데기 튀김’ 디시트렌드 09.08
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2