디시인사이드 갤러리

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

갤러리 본문 영역

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

나르시갤로그로 이동합니다. 2025.09.02 04:45:55
조회 59 추천 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/08/29 - -
공지 프로그래밍 갤러리 이용 안내 [96] 운영자 20.09.28 46876 65
2886695 와 요즘 군대 진짜 좋아졌네 ㅇㅇㅇㅇ(121.126) 02:56 1 0
2886693 흠.. 또 제안 [1] 꼬치의달인갤로그로 이동합니다. 02:26 13 0
2886692 가끔 이미 원형을 잃어버린 감정,기분이 문득 들때가 있다 [2] ♥냥덩이♥갤로그로 이동합니다. 02:21 25 0
2886690 폐업한 업체 영수증 찾았다. 캡처본 주문내역 파일명 -.pdf 넥도리아(220.74) 01:47 17 0
2886687 짤녀가 갑자기 어흥!하고 나타나면 어캄? [2] ♥냥덩이♥갤로그로 이동합니다. 01:33 33 0
2886685 모기냄새가 자욱하다. 모기 시체... SSD 밀어버렸다. Free too 넥도리아(220.74) 01:03 13 0
2886684 방구냄새가 진짜 지독하다 [4] 개멍청한유라갤로그로 이동합니다. 00:47 25 0
2886682 디시글이 16번째 글이 내글 조회가 안되냐 살아있는데, 악성코드가 가리냐 넥도리아(220.74) 00:27 11 0
2886681 깊은 산 속 옹달샘 누가 와서 먹나요? ♥냥덩이♥갤로그로 이동합니다. 00:17 24 0
2886680 나이 먹으면 말투가 비슷해지냐? [1] 루도그담당(58.239) 09.03 27 0
2886679 asml877543 ASML 저장장치 갤러리 보내버리는 방법 인성 더러운 넥도리아(220.74) 09.03 18 0
2886678 미유 플립 샀다 발명도둑잡기(39.7) 09.03 24 0
2886677 [감동실화]아스카 존나 빡쳐서 티비 부쉈다 [12] 아스카영원히사랑해갤로그로 이동합니다. 09.03 80 3
2886676 한반도 사는 사람들을 이렇게 만들어야 한다 발명도둑잡기(118.235) 09.03 25 0
2886674 음기 충전 발명도둑잡기(39.7) 09.03 29 0
2886672 와 요즘 군대 진짜 좋아졌네 ㅇㅇㅇㅇ(125.7) 09.03 28 0
2886671 여 "내란당 해산 불가피"…야, '압수수색 반발' 무기한 농성 발명도둑잡기(39.7) 09.03 12 0
2886670 형님들 도와주세요 mfc 파일 실행할줄을 모르겠습니다. [1] 암것도모름진짜(61.82) 09.03 21 0
2886669 2025 입시 입결 수직 급상승 로켓 떡상 탑 명문대O 프갤러(59.17) 09.03 26 1
2886666 번화가 모텔을 보니 슬퍼지는구나 발명도둑잡기(211.246) 09.03 37 0
2886665 긴급) 기프티콘 뿌린당❤ 선착순 ♥냥덩이♥갤로그로 이동합니다. 09.03 24 0
2886663 나님 끙야즁❤+ ♥냥덩이♥갤로그로 이동합니다. 09.03 28 0
2886662 공겹 준비하려고 자료구조 공부하려는데 ㅇㅇ(118.222) 09.03 18 0
2886659 스타크래프트 [1] 배구공(119.202) 09.03 31 0
2886658 165는 인간을 만날 생각 하면 안댐 ㅇㅅㅇ?? [1] ㅇㅇ(223.39) 09.03 20 0
2886657 서울과 부산 풍경 [2] ㅇㅇ(175.197) 09.03 44 0
2886656 루비점마는 에스트로겐 나올 때라서 그런가 왜 유동으로 저지랄이고 ㅆㅇㅆ(124.216) 09.03 32 0
2886655 가난한데 영화가 너무 좋다... 공부해야 하는데... ㅇㅇ(223.39) 09.03 20 0
2886654 위험하노, 위험하노 ㅇㅈㄹ 하지말고 [2] 프갤러(121.139) 09.03 47 1
2886653 애초에 있는 집 자식들이 학점에도 유리한게 ㅆㅇㅆ(124.216) 09.03 37 0
2886652 이번달 진짜 위험하노 ㅆㅇㅆ(124.216) 09.03 48 0
2886651 관악학생생활관 ㅇㅇ(117.111) 09.03 21 0
2886649 밥먹었어? 배구공(119.202) 09.03 16 0
2886648 내가 주로 사용하는 개발 도구 까발려 주겠다. 잘 배워둬라. [3] 프갤러(59.16) 09.03 49 0
2886647 실베에 뭐 서울대 불합격했지만 MIT 합격 이거보고 느끼는데 [15] ㅆㅇㅆ(124.216) 09.03 79 0
2886646 C++ 을 해야 하는 이유를 명확히 알려준다. [2] 프갤러(59.16) 09.03 77 0
2886644 근데 맨날 느끼는데 GPT 나오고나서도 [2] ㅆㅇㅆ(124.216) 09.03 51 0
2886643 야근하는 사람들 공통점. [2] 프갤러(59.16) 09.03 52 0
2886642 어느갤을 가보든 뭘 꺼꾸로 알고 있는 애들이 말이 많더라 [2] ㅇㅇ갤로그로 이동합니다. 09.03 47 0
2886641 혐오는 ❤을 이길 수 없당 ! ♥냥덩이♥갤로그로 이동합니다. 09.03 23 0
2886639 작은 회사에 들어가고 싶다. [13] 프갤러(58.230) 09.03 101 0
2886638 리엑트는 어느정도 할 줄 알아야함? [1] 프갤러(118.216) 09.03 50 0
2886634 요즘 한국인들 단체로 무적 콤플렉스 걸린듯? [1] ㅇㅇㅇ(175.211) 09.03 52 0
2886633 나는 ai가 말안들으면 욕하면서 일시키는데 싸이코패스임? [2] 꼬치의달인갤로그로 이동합니다. 09.03 63 0
2886632 쏘카 결과 원래 늦게 나오나? 프갤러(223.38) 09.03 37 0
2886631 요즘 막코더 형님 왜 안보이시냐 ㅆㅇㅆ(124.216) 09.03 21 0
2886630 칼뷰림이 왜 금지글? [1] 헬마스터갤로그로 이동합니다. 09.03 38 0
2886627 일본에서 10년간 일하면 본 충격적인 것들 [1] 프로외노자갤로그로 이동합니다. 09.03 46 1
2886626 나노바나나갤만듬 ㅇㅇ갤로그로 이동합니다. 09.03 43 0
뉴스 '은수 좋은 날' 송현욱 감독 X 전영신 작가, 작품 탄생 비하인드 공개! "평범한 일상 속 금기의 세계, 선택의 무게를 담다" 디시트렌드 09.03
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2