디시인사이드 갤러리

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

갤러리 본문 영역

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

나르시갤로그로 이동합니다. 2025.09.02 04:45:55
조회 115 추천 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/10/06 - -
AD 프로게이머가 될테야!! 운영자 25/10/01 - -
2886512 같이 신규게임하실?ㄱㄱㄱㄱㄱㄱㄱㄱㄱㄱㄱㄱ 프갤러(183.103) 09.02 90 0
2886509 냥덩 게임상 이 게임이 대단하당⭐ 1회 수상작 ♥냥덩이♥갤로그로 이동합니다. 09.02 92 0
2886507 회사에서 개발자를 가르쳐서 키워 쓴다는게 가능함? ㅇㅅㅇ; [1] 프갤러(60.196) 09.02 154 0
2886506 2025 수시 입결 수직 급상승 로켓 떡상 탑 명문대U 프갤러(59.17) 09.02 129 2
2886503 22살인데 복학해서 1학년 2학기다... 인생 망했다 프갤러(118.128) 09.02 104 0
2886502 주식 좀 폭락했으면 좋겠습니다 [5] 아스카영원히사랑해갤로그로 이동합니다. 09.02 136 0
2886501 4050 좌빨아저씨들도 한녀 걸러야 된다는 소리하는거 듣고 깜놀함 ♥냥덩이♥갤로그로 이동합니다. 09.02 104 0
2886500 귀칼 잼노 [1] 아스카영원히사랑해갤로그로 이동합니다. 09.02 105 0
2886499 ㄹㅇ 달달하당… [1] 꼬치의달인갤로그로 이동합니다. 09.02 147 0
2886498 회사도 당할만큼 당하니 경력자 안믿어 프갤러(59.16) 09.02 155 1
2886497 나님 쉬야완 ♥냥덩이♥갤로그로 이동합니다. 09.02 118 0
2886496 애초에 기업은 국가에서 제공하는 인프라를 받고 있음. ㅆㅇㅆ(124.216) 09.02 88 0
2886494 가끔 한국인들 틀딱들이 기본적으로 배움이 짧다는 걸 아랫글 보면 느낌 ㅆㅇㅆ(124.216) 09.02 120 2
2886492 회사에서 신입을 채용하지 않는 이유. [3] 프갤러(59.16) 09.02 263 0
2886491 재건축~ 재건축~ ♥냥덩이♥갤로그로 이동합니다. 09.02 93 0
2886490 비전공자 국비 부트캠프 지원하려는데 어떰? [3] 프갤러(58.127) 09.02 324 0
2886487 짱깨 폭동식 미리보기 ♥냥덩이♥갤로그로 이동합니다. 09.02 84 0
2886486 중국 블로그 1달 쉬었다가 라이징 스타 박탈됨 [4] ㅆㅇㅆ(124.216) 09.02 132 0
2886485 친중매국 찢재명 관세협상결과 고의로 숨겼나 충격 ♥냥덩이♥갤로그로 이동합니다. 09.02 82 0
2886484 정은경 복지부 장관 미국도 버리는 백신 530만개 구입 ♥냥덩이♥갤로그로 이동합니다. 09.02 92 0
2886483 통일교와 이재명의 관계 의문인가 의혹인가 ♥냥덩이♥갤로그로 이동합니다. 09.02 116 0
2886481 러스트가 근데 출시 이후 아직까지 사용처가 적어 프갤러(125.179) 09.02 98 0
2886480 학벌차이 프갤러(121.139) 09.02 103 0
2886478 제 2의 한국전쟁 초읽기 [1] ♥냥덩이♥갤로그로 이동합니다. 09.02 113 0
2886476 친중매국 찢재명의 처참한 말로 ♥냥덩이♥갤로그로 이동합니다. 09.02 96 0
2886474 틀딱이나 이런게 아니라 진짜 선배라면 좀 유명 도서나 ㅆㅇㅆ(124.216) 09.02 96 0
2886473 요즘 내 휴대폰 웹에 IT노조인가 개틀딱 사이버 잡부 사이트 뜨더라 [6] ㅆㅇㅆ(124.216) 09.02 148 0
2886472 시니어라는 이유만으로 개뻘소리 하는걸 추앙해야됨? [3] 꼬치의달인갤로그로 이동합니다. 09.02 114 0
2886471 저장용☘+ ♥냥덩이♥갤로그로 이동합니다. 09.02 119 0
2886469 코드를 잘 짜고싶어도 잘짜여진 코드를보고배워야지 [7] 밀우갤로그로 이동합니다. 09.02 162 0
2886468 레거시 틀딱 코드 만져야할때나 클린 코드 안하는거지 ㅆㅇㅆ(124.216) 09.02 93 0
2886467 요즘 좇소가 원하는스펙이 몇년만에 거의 대기업들스펙이누ㅋㅋㅋ 뒷통수한방(1.213) 09.02 98 0
2886466 클린코드를 지켜야 SEO에 조금이라도 노출되지 ㅆㅇㅆ(124.216) 09.02 81 0
2886465 클린코드라는게 뭐임? [1] ㅇㅇ갤로그로 이동합니다. 09.02 109 0
2886464 클린코드좀해줘 [1] 밀우갤로그로 이동합니다. 09.02 95 0
2886463 클린코드 타령만 안했으면 ㅆㅇㅆ 조금 고평가 했을수도 있었음. ㅇㅇ(121.186) 09.02 99 0
2886462 ■요즘 컴공(지잡)나와서 전공 못살려도 이상한거아니지? ㅇㅇ갤로그로 이동합니다. 09.02 89 0
2886461 극좌배급견 왜하세요? ♥냥덩이♥갤로그로 이동합니다. 09.02 126 1
2886459 냥덩이의 소중한 칭구가 되어주세양❤ ♥냥덩이♥갤로그로 이동합니다. 09.02 76 0
2886457 한국 애들은 돈번다는 이야기도보면 어떤 지표나 가치를 분석하는게 아님 ㅆㅇㅆ(124.216) 09.02 101 0
2886454 나는 웹한다는 애들이 클린코드 안한다는거보면 좀 저능아 같은게 뭐냐면 ㅆㅇㅆ(124.216) 09.02 109 0
2886453 잘릴거같다 [1] 프갤러(1.242) 09.02 106 0
2886451 클린 코딩이라는게 그냥 구글 권장이라 걍 할 수밖에 없어 ㅆㅇㅆ(124.216) 09.02 91 0
2886450 여학생 폭행,성희롱 상습 음주운전 범죄자가 교육부 장관인 나라가 있다? ♥냥덩이♥갤로그로 이동합니다. 09.02 90 0
2886447 요즘 si 대기업에서 mz들이 클린코딩 도입한다는데 [2] ㅇㅇ(106.102) 09.02 151 0
2886446 솔직히 취업에 제일좋은게 요즘은 노드아닌가싶음 [1] 밀우갤로그로 이동합니다. 09.02 182 0
2886445 나님 탈갤합니당☘ ♥냥덩이♥갤로그로 이동합니다. 09.02 89 0
2886443 위대한 따거들의 유쾌한 반란 아스카영원히사랑해갤로그로 이동합니다. 09.02 104 0
2886440 시발 연봉2800도 존나 빡쌘듯 프갤러(183.107) 09.02 184 0
2886437 돈은 노가다 할 때가 더 잘벌긴함 [9] ㅆㅇㅆ(124.216) 09.02 155 0
뉴스 ‘백번의 추억’ 김다미X허남준, 사랑보다 먼 우정보다는 가까운 썸 모먼트 셋! 디시트렌드 10.09
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2