디시인사이드 갤러리

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

갤러리 본문 영역

러빨러도 울고 갈, Ada 예외 처리, 6.5 Ada.Exceptions

나르시갤로그로 이동합니다. 2025.09.16 02:26:35
조회 87 추천 0 댓글 1

6.5 Ada.Exceptions 패키지

Ada.Exceptions 패키지는 예외 관련 정보를 다루기 위한 타입과 서브프로그램을 제공합니다.

6.5.1 타입 (Types)

Ada.Exceptions 패키지에는 예외를 다루기 위한 타입과 관련 상수가 정의되어 있습니다.

Exception_Id 타입은 각각의 예외를 고유하게 식별하는 타입입니다. NULL_ID 상수는 Exception_Id 타입의 상수로, 어떠한 예외도 나타내지 않습니다. 이 값은 Exception_Id 타입의 기본 초기값으로 사용됩니다.

Exception_Occurrence 타입은 발생한 예외의 특정 인스턴스에 대한 정보를 나타내는 limited private 타입입니다. 예외 처리기에서 when e : others처럼 선언된 상수 e가 이 타입에 해당합니다. NULL_OCCURRENCE 상수는 Exception_Occurrence 타입의 상수로, 어떠한 예외 발생도 나타내지 않습니다. 이 값은 Exception_Occurrence 타입의 기본 초기값으로 사용됩니다.

Exception_Occurrence_Access 타입은 Exception_Occurrence 객체를 가리키는 접근(access) 타입이며 save_occurrence 함수와 함께 사용되어, 예외 발생 정보를 힙(heap)에 저장하거나 다른 태스크로 전달하는 등의 동적 처리를 가능하게 합니다.

6.5.2 예외 정보 조회 (information retrieval)

다음의 함수들은 발생한 예외(Exception_Occurrence)나 예외의 종류(Exception_Id)에 대한 정보를 반환하는 역할을 합니다.

exception_identity (x : Exception_Occurrence) return Exception_Id;
-- 이 함수는 주어진 예외 발생 인스턴스에 대한 예외의 고유 식별자(`Exception_Id`)를 반환합니다.

exception_name (id : Exception_Id) return String;
-- 이 함수는 예외의 고유 식별자인 `Exception_Id`를 매개변수로 받아, 해당 예외의 이름(예: `CONSTRAINT_ERROR`)을 반환합니다. `'identity` 속성으로 얻은 ID 값을 사용할 때 유용합니다.

exception_name (x : Exception_Occurrence) return String;
-- 이 함수는 실제로 발생한 예외의 인스턴스인 `Exception_Occurrence`를 매개변수로 받아, 해당 예외의 이름을 반환합니다. (내부적으로 `exception_name (exception_identity (x))`를 호출하는 것과 동일합니다.) 예외 처리기에서 `when e : others =>`와 같이 예외 발생 정보를 받았을 때 사용합니다.

exception_message (x : Exception_Occurrence) return String;
-- 예외 발생 시 연관된 메시지를 반환합니다. `raise with "메시지";`와 같이 발생한 예외의 경우 해당 메시지를 반환합니다.

exception_information (x : Exception_Occurrence) return String;
-- 구현에 따라 정의된, 디버깅에 유용한 상세 정보를 문자열로 반환합니다.

wide_exception_name (id : Exception_Id) return Wide_String;
-- `Exception_Name`과 유사하지만, 예외의 전체 확장 이름을 `Wide_String` 타입으로 반환합니다.

wide_exception_name (x : Exception_Occurrence) return Wide_String;
-- 주어진 예외 발생(x)에 대한 예외 이름을 `Wide_String` 타입으로 반환합니다.

wide_wide_exception_name (id : Exception_Id) return Wide_Wide_String;
-- 예외의 전체 확장 이름을 `Wide_Wide_String` 타입으로 반환합니다.

wide_wide_exception_name (x : Exception_Occurrence) return Wide_Wide_String;
-- 주어진 예외 발생(x)에 대한 예외 이름을 `Wide_Wide_String` 타입으로 반환합니다.

-- 예외 정보 조회 예시
with Ada.Text_IO, Ada.Exceptions;
procedure information_example is
  use Ada.Exceptions;
  My_Error : exception;
begin
  -- 예외와 함께 메시지 발생
  raise My_Error with "데이터 처리 중 오류 발생";
exception
  when e : others =>
    Ada.Text_IO.put_line ("예외가 포착되었습니다.");
    Ada.Text_IO.put_line ("예외 이름: " & exception_name (e));
    Ada.Text_IO.put_line ("예외 메시지: " & exception_message (e));
    Ada.Text_IO.put_line ("구현 정의 정보: " & exception_information (e));
end information_example;

6.5.3 예외 발생 및 전파 (Raising and Propagation)

다음의 프로시저들은 예외를 능동적으로 발생시켜 프로그램의 정상적인 실행 흐름을 중단시키는 역할을 합니다.

raise_exception (e       : in Exception_Id;
                 message : in String := "");
-- `Exception_Id`로 식별되는 예외를 주어진 메시지와 함께 발생시키는 프로시저입니다.

reraise_occurrence (x : in Exception_Occurrence);
-- 주어진 `Exception_Occurrence`를 다시 발생시킵니다. 이는 예외 처리기 내에서만 사용 가능한 `raise;` 문과 달리, 예외 처리기 외부에서도 원래의 예외 발생 정보를 그대로 전파할 수 있게 합니다.

-- 예외 발생 및 전파 예시:
-- 하위 루틴에서 발생한 예외를 상위 루틴으로 전달하고 메시지를 출력
with Ada.Text_IO, Ada.Exceptions;

procedure propagation_example is
  use Ada.Exceptions;

  procedure inner_routine is
    My_Custom_Error : exception;
  begin
    -- `raise_exception`을 사용하여 사용자 정의 예외와 메시지를 함께 발생시킴
    raise_exception (My_Custom_Error'identity, "입력값이 유효하지 않습니다.");
  exception
    when e : others =>
      Ada.Text_IO.put_line ("내부(하위) 루틴에서 예외 포착: " &
                            exception_name (e));
      -- 포착된 예외를 다시 발생시켜 외부(상위) 루틴으로 전달
      reraise_occurrence (e);
  end inner_routine;

begin
  begin
    inner_routine;
  exception
    when e : others =>
      Ada.Text_IO.put_line ("외부(상위) 루틴에서 예외 재포착: " &
                            exception_name (e));
      Ada.Text_IO.put_line ("메시지: " & exception_message (e));
  end;
end propagation_example;

6.5.4 예외 발생 정보 관리 (Occurrence Management)

다음의 서브프로그램들은 Exception_Occurrence 객체 자체를 복사, 저장, 또는 스트림을 통해 전송하는 등 관리하는 역할을 합니다.

save_occurrence (target : out Exception_Occurrence;
                 source : in  Exception_Occurrence);
-- `source` 예외 발생 인스턴스를 `target` 으로 복사합니다.

save_occurrence (source : Exception_Occurrence)
return Exception_Occurrence_Access;
-- 새로운 `Exception_Occurrence` 객체를 동적으로 할당하고 `source`의 내용을 복사한 후, 해당 객체를 가리키는 `Exception_Occurrence_Access` 타입의 값을 반환합니다.

write_exception_occurrence (
  stream : not null access Ada.Streams.Root_Stream_Type'class;
  item   : in Exception_Occurrence);
-- 예외 발생 인스턴스에 대한 표현을 스트림에 기록합니다.

read_exception_occurrence (
  stream : not null access Ada.Streams.Root_Stream_Type'class;
  item   : out Exception_Occurrence);
-- 스트림으로부터 예외 발생 인스턴스를 재구성합니다. 이는 다른 파티션(partition)에 기록된 예외도 포함합니다.

-- `save_occurrence`를 활용한 예외 정보 관리 예시
with Ada.Text_IO, Ada.Exceptions, Ada.Integer_Text_IO;
with Ada.IO_Exceptions;

procedure save_example is
  use Ada.Exceptions;

  function get_input return Integer is
    value : Integer;
  begin
    Ada.Text_IO.put ("숫자를 입력하세요 (0 입력 시 예외 발생): ");
    Ada.Integer_Text_IO.get (value);
    return value;
  end get_input;

  -- 예외 정보를 저장할 변수
  err_occ : Exception_Occurrence;

begin
  begin
    declare
      v : constant Integer := get_input;
    begin
      -- 입력값으로 나눗셈 수행 (0 입력 시 예외 발생)
      Ada.Text_IO.put_line ("결과: " & Integer'image (10 / v));
    exception
      -- 내부 블록에서 발생한 모든 예외 처리
      when e : others =>
        Ada.Text_IO.put_line ("예외가 발생했습니다 (내부 블록).");
        save_occurrence (err_occ, e);
    end;
  exception
    -- 입력 스트림 종료 예외 처리
    when e : Ada.IO_Exceptions.End_Error =>
      Ada.Text_IO.put_line ("오류: 입력 스트림이 종료되었습니다.");
      -- 예외 정보를 저장하여 일관된 처리 유지
      save_occurrence (err_occ, e);
    -- 외부 블록에서 발생한 기타 예외 처리
    when e : others =>
      Ada.Text_IO.put_line ("예외가 발생했습니다 (외부 블록).");
      save_occurrence (err_occ, e);
  end;

  Ada.Text_IO.put_line ("저장된 예외 정보:");
  if exception_identity (err_occ) /= NULL_ID then
    Ada.Text_IO.put_line ("예외 이름: " & exception_name (err_occ));
    Ada.Text_IO.put_line ("예외 메시지: " & exception_message (err_occ));
  else
    Ada.Text_IO.put_line ("저장된 예외가 없습니다.");
  end if;

end save_example;

6.5.5 'identity 속성

'identity 속성은 예외의 이름으로부터 시스템이 내부적으로 사용하는 고유 식별값(Exception_Id 타입의 값)을 얻어오는 데 사용됩니다. 이 속성은 프로그래머가 직접 선언한 예외와 Constraint_Error처럼 언어에 미리 정의된 예외 모두에 사용할 수 있습니다.

예를 들어, Ada.Exceptions.raise_exception 프로시저를 통해 특정 예외를 발생시키려면 해당 예외의 Exception_Id 값이 필요합니다. 이때 어떤 예외를 발생시킬지 이름을 알고 있다면 'identity 속성을 사용하고, 예외 처리기 안에서 어떤 예외가 발생했는지 모르는 상황이라면 exception_identity 함수를 사용하여 Exception_Id 값을 얻을 수 있습니다.

예시:

with Ada.Text_IO, Ada.Exceptions;
procedure id_attribute_example is
  use Ada.Exceptions;
  -- 사용자 정의 예외 선언
  Overflow  : exception;
  Underflow : exception;

begin
  -- 'identity 속성을 사용하여 예외 발생시키기
  Ada.Exceptions.raise_exception (Overflow'identity,
                                  "Overflow detected manually.");

exception
  when e : others =>
    Ada.Text_IO.put_line ("An exception was caught.");

    -- exception_identity 함수를 사용하여 발생한 예외의 ID를 얻음
    declare
      the_id : constant Ada.Exceptions.Exception_Id :=
        Ada.Exceptions.exception_identity (e);
    begin
      Ada.Text_IO.put_line ("Message: " & Ada.Exceptions.exception_message (e));

      -- 얻어낸 ID를 사용하여 어떤 예외인지 확인
      if the_id = Overflow'identity then
        Ada.Text_IO.put_line ("The exception was Overflow.");
      elsif the_id = Underflow'identity then
        Ada.Text_IO.put_line ("The exception was Underflow.");
      else
        Ada.Text_IO.put_line ("It was some other exception.");
      end if;
    end;

end id_attribute_example;


https://nimfsoft.art/ko/books/ada-programming/#65-adaexceptions-%ED%8C%A8%ED%82%A4%EC%A7%80


 



오늘은 여기까지입니다. 6.6절부터 작성해야되요. ㅠㅠ


추천 비추천

0

고정닉 0

0

댓글 영역

전체 댓글 0
본문 보기

하단 갤러리 리스트 영역

왼쪽 컨텐츠 영역

갤러리 리스트 영역

갤러리 리스트
번호 제목 글쓴이 작성일 조회 추천
설문 센터해도 될 것 같이 비주얼 물오른 아이돌 멤버는? 운영자 25/09/22 - -
이슈 ‘용원게이’를 넘어 배우 장용원으로 운영자 25/09/23 - -
AD 프로게이머가 될테야!! 운영자 25/09/12 - -
2890267 내가 대학생 졸업과제 외주를 못 끊는게 뭐냐면 [2] ㅆㅇㅆ(124.216) 09.19 90 0
2890265 싼값에 외주하면서 느끼는데 정보 얻는게 많다 [1] ㅆㅇㅆ(124.216) 09.19 66 0
2890264 “남녀 각 1%는 성관계 갖지 않아”…그들의 특징은? 발명도둑잡기(118.216) 09.19 49 0
2890263 또 MBK…롯데카드 인수해 배당 2000억 챙기고 '보안투자' 뒷전 발명도둑잡기(118.216) 09.19 45 0
2890262 바이비트 자동 매매 만들준비나 해야겠다 [2] ㅆㅇㅆ찡갤로그로 이동합니다. 09.19 61 0
2890261 나님 뛰뛰 20km ♥냥덩이♥갤로그로 이동합니다. 09.19 49 0
2890260 애비새끼가 노인거리지말라고하는데 그럼 뭐라고해야함?? [1] 타이밍뒷.통수한방(1.213) 09.19 45 0
2890259 dvdprime 게시판은 갯수가 적지만 조회수가 1000대네? 발명도둑잡기(118.216) 09.19 35 0
2890257 못생겨도 여자들이 좋아하는 남자 특징 ㅇㅇㅇㅇ(115.144) 09.19 65 0
2890256 러빨러는 어떻게 해야 완벽 차단이 가능할까 나르시갤로그로 이동합니다. 09.19 42 0
2890255 케이뱅크 애용자로서 문의드립니다. 최대 출금 내역 1000만원에서 10으 넥도리아(220.74) 09.19 86 0
2890254 부산국제영화제로 요새 숙소 얼마정도 하나 발명도둑잡기(118.216) 09.19 54 0
2890253 ❤✨☀⭐⚡☘⛩나님 시작합니당⛩☘⚡⭐☀✨❤ ♥냥덩이♥갤로그로 이동합니다. 09.19 54 0
2890251 '100년물 국채 강매' 공포의 보고서 작성자...연준 투입된 트럼프 최 발명도둑잡기(118.216) 09.19 51 0
2890250 db/sql 공부법 질문 프갤러(165.229) 09.19 53 0
2890249 라면에 계란, 고기를 넣어야 포만감이 오래 가는 듯 [1] 발명도둑잡기(118.216) 09.19 42 0
2890248 ❤✨☀⭐⚡☘⛩나로님 퇴근합니당⛩☘⚡⭐☀✨❤ Naro갤로그로 이동합니다. 09.19 34 0
2890247 요새 해외 디코 들어가도 codex 가 그렇게 뜬다길래 써볼려고하는데 ㅆㅇㅆ(124.216) 09.19 71 0
2890246 사회초년생이라 얼마 없대서 20만짜리 15만에 해줬는데 [2] ㅆㅇㅆ찡갤로그로 이동합니다. 09.19 77 0
2890245 오늘도 기부니가 더러워서 또 칼퇴 할거고요 [3] 프갤러(218.154) 09.19 57 0
2890244 하다보면 선호하는 언어가 생겨 프갤러(218.154) 09.19 58 0
2890243 중국 망한다는 놈들아 중국 5.2% 성장이라고 한다 [1] 발명도둑잡기(118.216) 09.19 52 1
2890242 근데 언어 자체에 목 매달고 [2] 루도그담당(211.184) 09.19 64 0
2890241 오늘도 적당히 벌어 외주 납품함. [2] ㅆㅇㅆ(124.216) 09.19 66 0
2890240 8체질 한의학에서 부부끼리도 밥을 따로 먹는게 좋다고 가르칩니다 발명도둑잡기(118.216) 09.19 42 0
2890239 미개한 리액트 버리고 leptos 합시다. 프갤러(218.154) 09.19 53 0
2890238 자바의 좋은 점 정말 모르냐? [2] 나르시갤로그로 이동합니다. 09.19 58 0
2890237 너 왜 영어 써? 왜 중국어 써? [2] 나르시갤로그로 이동합니다. 09.19 46 0
2890236 칼퇴는 그냥 하면 되는건데 논쟁할게 뭐가 있음? [3] 프갤러(218.154) 09.19 49 0
2890235 영화 <731> 한국 개봉이 시급하다. 반드시 개봉되어야. 발명도둑잡기(118.216) 09.19 46 1
2890234 [애니뉴스] 귀인환등초 팬픽 소설 - 환상초한전 프갤러(121.172) 09.19 33 0
2890233 짜장이냐 짬뽕이냐 언어논쟁보다 야근이냐 칼퇴냐 논쟁이 더 유익하다 발명도둑잡기(118.216) 09.19 37 0
2890232 근데 한국인들이 전부 들쥐처럼 보이면 정신병임? [3] ㅇㅇㅇ(222.110) 09.19 62 0
2890231 리액트 왜케 미개하냐? [4] 헬마스터갤로그로 이동합니다. 09.19 113 0
2890230 곧 전쟁날듯 [5] ♥냥덩이♥갤로그로 이동합니다. 09.19 93 0
2890229 이 대통령 “한국, 교류협력의 가교…안미경중으로 못 돌아가” 발명도둑잡기(118.216) 09.19 69 0
2890228 “이거 그냥 김광석 노래잖아”…일본 밴드 신곡 표절 논란 발명도둑잡기(118.216) 09.19 50 0
2890227 “통일교 12만, 신천지 10만...윤석열, 교주 지령으로 대선후보 돼” 발명도둑잡기(118.216) 09.19 59 0
2890226 엘튼존 라이온킹 중앙집권 독재자 인공지능 회사에게 먹히다 발명도둑잡기(118.216) 09.19 31 0
2890225 후후후.. 누구에겐 절망이지만 나에게는 좋은일이다. 프갤러(121.139) 09.19 53 1
2890224 언어가지고 싸우지마 ㅇㅇ갤로그로 이동합니다. 09.19 68 3
2890223 일본인들이 한국분들한테 7000만원 쏩니다✨ [1] ㅇㅇ(211.234) 09.19 73 0
2890222 대법관, 검사장 직선제, 지방법관, 지방검사장 직선제 지방자치 쟁취 발명도둑잡기(118.216) 09.19 32 0
2890221 ㅋㅋ 날떨어뜨려준 회사에 고맙게 생각한다 고맙다 프갤러(121.139) 09.19 64 0
2890220 다시 자바 얘기로 돌아가서 이새끼들 존나 싸가지 없습니다. [1] 프갤러(218.154) 09.19 70 1
2890219 점심 발명도둑잡기(118.216) 09.19 37 0
2890218 너같은게 무슨 네임드 이러고 자빠집니까 병신끼리 똥꼬 빨았겠져 프갤러(218.154) 09.19 46 0
2890217 그 보석새끼 아프다던데 빨리 안뒈집니까? 프갤러(218.154) 09.19 52 0
2890216 러스트충 씹새기야 도배하지마라. 프갤러(121.139) 09.19 52 2
2890215 코틀린 얘기는 꺼내지도 마십시오 프갤러(218.154) 09.19 63 0
뉴스 '2025 가평 G-SL' 뮤직페스티벌 10월 4일 . . 나윤권·이수영·문희원·윤그루·무드등 디시트렌드 09.23
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2