디시인사이드 갤러리

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

갤러리 본문 영역

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

나르시갤로그로 이동합니다. 2025.09.02 04:45:55
조회 107 추천 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/22 - -
이슈 ‘용원게이’를 넘어 배우 장용원으로 운영자 25/09/23 - -
AD 프로게이머가 될테야!! 운영자 25/09/12 - -
2886966 보통 프로그래밍이라는게 주로 공통 패턴이 꽤 있어 [2] ㅆㅇㅆ(124.216) 09.05 140 0
2886965 사실 천재 아니고서야 꾸준함이 맞긴 해 [3] 루도그담당(210.104) 09.05 103 0
2886964 농담이 아니고 프로그래밍은 진짜 3년을 하면 기초적인거 할 수 있음 [2] ㅆㅇㅆ(124.216) 09.05 143 0
2886963 AI에 대해 무지할수록 AI를 맹신하고 찬양하는거같음 [2] ㅇㅇ(119.194) 09.05 116 0
2886962 프로그래밍 공부 꿀팁있나요 [4] Fhiwjsjsjeje갤로그로 이동합니다. 09.05 138 0
2886961 처음부터 다 할려고 하니까 어려운거지 그냥 쓰는것만 써라 ㅆㅇㅆ(124.216) 09.05 91 0
2886960 아니 rag 납품준비 끝냈더니 갑자기 맘바꼈다 ㅆㅇㅆ(124.216) 09.05 85 0
2886959 프로그래머들은 다 천재인가요? [7] Fhiwjsjsjeje갤로그로 이동합니다. 09.05 153 0
2886958 흑흑 고맙습니다. 뉴프로 [6] ㅆㅇㅆ(124.216) 09.05 129 0
2886957 집에 가서 씻고 자야겠다 루도그담당(118.235) 09.05 69 0
2886956 지금 AI Hype는 워낙 세계가 힘드니까 미래 산업에 대한 펌프질이지 [2] ㅆㅇㅆ(124.216) 09.05 93 0
2886955 지잡 컴공인데 전산직하려면 뭐 있어야하냐 [3] ㅇㅇ갤로그로 이동합니다. 09.05 179 0
2886954 AGI가 올까 [2] 루도그담당(210.104) 09.05 88 0
2886952 지피티 검색 기능도 Rag 아니냐? [4] 루도그담당(210.104) 09.05 121 0
2886951 지피티 아쉬운 점이 [1] 루도그담당(210.104) 09.05 81 0
2886949 RAG는 내가 저장하거나 만들어둔 MD나 pdf 파일로 읽는거임 [1] ㅆㅇㅆ(124.216) 09.05 120 0
2886947 간단 RAG 납품 준비 완료 [2] ㅆㅇㅆ(124.216) 09.05 114 0
2886946 근데 확실히 AI가 코드 스켈레톤은 잘 짜주는데 핵심 로직 코딩은 ㅆㅇㅆ(124.216) 09.05 98 0
2886944 9월 5일 오늘까지! ㅇㅇ(106.101) 09.05 88 0
2886943 대학생 퍼플렉시티 12개월 + 코멧 또 뿌림 프갤러(163.152) 09.05 308 0
2886942 프로그래스바에 진행도 퍼센테이지 올라가는거 사원 시킴ㅇㅇ 프갤러(60.196) 09.05 79 0
2886941 해커뉴스보는데 ai쓰고 오히려 생산성준다네 [5] ㅆㅇㅆ(124.216) 09.05 147 0
2886940 23살, 가진것도 아는것도 없는 인생이 괴롭다. [1] ㅇㅇ(223.38) 09.05 120 0
2886939 나님 딱 이만큼만 살레 ♥냥덩이♥갤로그로 이동합니다. 09.05 90 0
2886938 공부를 할수록 감각이 살짝 맛가는거같음 공기역학갤로그로 이동합니다. 09.05 117 0
2886937 김줭은 위원좡뉘임~ 줘 박쥐원 입니다아~ ㅋㅋㅋㅋㅋㅋㅋㅋㅋ ♥냥덩이♥갤로그로 이동합니다. 09.05 100 0
2886936 북한간첩딸이 5개국어하고 더 잘사는세상인데 노력 ㅇㅈㄹ ㅋㅋㅋ 뒷통수한방(1.213) 09.05 71 0
2886935 프롬프트 엔지니어라. 무당이 기우제 지내면 레인 엔지니업니까? [2] 프갤러(218.154) 09.05 121 0
2886934 덥다 루도그담당(118.235) 09.05 62 0
2886933 나르시님 책 출판함? 온라인출판은 위키북스가 좋음 ㅇㅇ(175.197) 09.05 81 0
2886932 전라도 [2] ♥냥덩이♥갤로그로 이동합니다. 09.05 86 0
2886931 극좌선동에 속은 결과는 언제나 파멸이당 ♥냥덩이♥갤로그로 이동합니다. 09.05 77 0
2886930 Ada로 첫 프밍이 주식 자동 매매 앱이.될 듯 [4] 나르시갤로그로 이동합니다. 09.05 135 0
2886929 결과해석도 프로파간다 수준;; ♥냥덩이♥갤로그로 이동합니다. 09.05 78 0
2886927 누가 나님 냥덩이.. ♥냥덩이♥갤로그로 이동합니다. 09.05 101 0
2886924 30대 여자에게 인기많은 50대 얼굴 ㅁㅌㅊ? ♥냥덩이♥갤로그로 이동합니다. 09.05 113 0
2886920 [하나은행] 디지털 하나로 Digital Hana 路 (~9/14) 프갤러(121.130) 09.05 190 0
2886916 형님은 정상인인데 그 동생인 이재명은 왜.. ♥냥덩이♥갤로그로 이동합니다. 09.05 101 0
2886915 사업방향 전환함 뉴진파갤로그로 이동합니다. 09.05 79 0
2886911 러빨러는 제발 러스트 좀 사용해봐라 나르시갤로그로 이동합니다. 09.05 83 0
2886910 Ada 책 집필 방향을 변경해야겠다 나르시갤로그로 이동합니다. 09.05 76 0
2886909 너무 바빠서 러스트 깔 시간이 없다 나르시갤로그로 이동합니다. 09.05 84 0
2886908 등처먹기 하나 만큼은 특기입니다만... 프갤러(118.235) 09.05 80 0
2886907 주술회전 후속작 1화 [2] ♥냥덩이♥갤로그로 이동합니다. 09.05 119 0
2886906 뉴프로에서 기프티콘 뿌린다 [1] 개멍청한유라갤로그로 이동합니다. 09.05 92 0
2886905 오늘 저녁 내 치킨을 뜯겠습니다 [3] 루도그담당(118.235) 09.05 93 0
2886904 아스카 주식 계좌 하루에 15만원씩 느는데 [4] 아스카영원히사랑해갤로그로 이동합니다. 09.05 133 0
2886903 뉴프로에서 베라 아이스크림 받아가라 이기 [1] 헬마스터갤로그로 이동합니다. 09.05 104 0
2886902 SI 파견가서 하는 프로젝트 수준이 어느정도임? [2] 프갤러(106.101) 09.05 146 0
2886900 냥덩이가 먹어도 되는 인간음식들❤+ ♥냥덩이♥갤로그로 이동합니다. 09.05 69 0
뉴스 '화려한 날들' 정일우X천호진, 갈등과 상처에도 끈끈한 가족애 그려내다! 디시트렌드 14:00
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2