디시인사이드 갤러리

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

갤러리 본문 영역

러빨러도 울고 갈, Ada 예외 처리, 6.2 예외 발생시키기

나르시갤로그로 이동합니다. 2025.09.16 02:22:29
조회 53 추천 0 댓글 0

6.2 예외 발생시키기 (raising exceptions)

6.2.1 묵시적 발생 (implicit raising)

프로그래머가 예외를 접하는 일반적인 경로는 묵시적 발생입니다. 이는 Ada 언어가 프로그램의 안정성 및 정확성 보장을 위해 내장한 언어 정의 런타임 검사(language-defined check)가 실패했을 때 발생합니다.

런타임 검사는 프로그램 실행 중에 특정 연산이 유효한지를 확인하는 자동화된 과정입니다. 만약 검사 조건이 거짓으로 판명되면, 검사는 실패하고 그에 상응하는 미리 정의된 예외가 자동으로 발생합니다.

다음은 런타임 검사 실패로 인해 Constraint_Error가 묵시적으로 발생하는 사례들입니다.

인덱스 범위 위반 (Index_Check 실패)

배열에 정의된 범위를 벗어나는 인덱스로 접근하려 할 때 Index_Check가 실패하여 Constraint_Error가 발생합니다.

my_array : array (1 .. 4) of Integer;
value    : Integer;
...
value := my_array(5); -- 5는 1..4 범위를 벗어나므로 Constraint_Error 발생

0으로 나누기 (Division_Check 실패)

숫자를 0으로 나누려고 시도하면 Division_Check가 실패하여 Constraint_Error가 발생합니다.

a      : Integer := 10;
b      : Integer := 0;
result : Integer;
...
result := a / b; -- 0으로 나누므로 Constraint_Error 발생

널(null) 접근 (Access_Check 실패)

null 값을 가지는 접근 타입(access type) 변수를 역참조(dereference)하려 하면 Access_Check가 실패하여 Constraint_Error가 발생합니다.

type Int_Access is access Integer;
ptr   : Int_Access := null;
value : Integer;
...
value := ptr.all; -- null을 역참조하므로 Constraint_Error 발생

묵시적으로 발생할 수 있는 예외와 그와 관련된 언어 정의 런타임 검사를 정리하면 다음과 같습니다.

Constraint_Error는 어떤 값이 특정 제약 조건(constraint)을 위반할 때 다음과 같은 런타임 검사가 실패하여 발생합니다.

  • Access_Check: 값이 널(null)이 아니어야 하는 경우 이를 검사합니다.
  • Discriminant_Check: 복합 객체의 판별자(discriminant)가 올바른 값을 가졌는지 검사합니다.
  • Division_Check: 나눗셈 연산(/, rem, mod)의 두 번째 피연산자가 0이 아닌지 검사합니다.
  • Index_Check: 배열의 인덱스 값이 경계 내에 있는지 검사합니다.
  • Length_Check: 두 배열의 길이가 일치하는지 검사합니다.
  • Overflow_Check: 스칼라 값이 해당 타입의 기본 범위를 벗어나지 않는지 검사합니다.
  • Range_Check: 스칼라 값이 특정 범위 제약 조건을 만족하는지 검사합니다.
  • Tag_Check: 태그드 타입(tagged type)의 태그가 올바른지 검사합니다.

Program_Error는 프로그램의 실행 순서나 접근 규칙 등 논리적으로 실행될 수 없는 상황에서 다음과 같은 런타임 검사가 실패하여 발생합니다.

  • Accessibility_Check: 접근하려는 객체의 접근성 수준(accessibility level)을 검사합니다.
  • Allocation_Check: 할당자(allocator)가 호출될 때 태스크가 올바른 상태인지 등을 검사합니다.
  • Elaboration_Check: 호출하려는 서브프로그램 등의 몸체가 이미 정교화(elaborated)되었는지 검사합니다.
  • Program_Error_Check: 그 외 다양한 언어 규칙 위반 상황을 검사합니다.

Storage_Error는 메모리 관련 문제가 발생했을 때 다음과 같은 런타임 검사가 실패하여 발생합니다.

  • Storage_Check: 할당 가능한 메모리 공간이 충분한지, 또는 태스크나 서브프로그램이 스택 공간을 초과하지 않았는지 검사합니다.

Tasking_Error는 태스크(task) 간의 통신이나 동기화 과정에서 문제가 발생했을 때 다음과 같은 런타임 검사가 실패하여 발생합니다.

  • Tasking_Check: 호출된 태스크가 아직 종료되지 않았는지 등을 검사합니다.

이러한 런타임 검사들을 비활성화하여 프로그램의 성능을 높이는 방법에 대해서는 6.7절에서 자세히 다룹니다.

6.2.2 명시적 발생: raise 문과 표현식

묵시적 발생 외에도, 프로그래머가 특정 조건이 충족되었을 때 코드에서 직접 예외를 발생시킬 수 있습니다. 이는 주로 예상된 오류 조건을 처리하거나, 서브프로그램의 사전/사후 조건을 강제하는 데 사용됩니다.

raise 문(statement)

raise 문은 예외를 발생시키는 독립적인 실행문입니다. 세 가지 형태로 사용할 수 있습니다.

1. 예외 이름으로 예외 발생시키기

가장 기본적인 형태로, 지정된 이름의 예외를 발생시킵니다.

-- Overflow는 이전에 선언된 예외 이름
raise Overflow;

2. 메시지와 함께 예외 발생시키기

예외 발생 시 특정 문자열 메시지를 함께 전달할 수 있습니다. 이 메시지는 나중에 예외 처리기에서 Ada.Exceptions.exception_message 함수를 통해 확인할 수 있어 디버깅에 유용합니다.

raise Constraint_Error with "입력 버퍼가 가득 찼습니다.";

3. 예외 다시 발생시키기 (re-raise)

raise; 형태는 오직 예외 처리기(exception handler) 내부에서만 사용할 수 있습니다. 이 구문은 현재 처리 중인 예외 발생(occurrence)을 그대로 상위 실행 문맥으로 다시 전파하는 역할을 합니다. 이는 예외를 부분적으로 처리(예: 로그 기록)한 후, 상위 처리기에게 마저 처리하도록 위임할 때 유용합니다.

begin
-- 예외가 발생할 수 있는 코드
exception
  when e : others =>
    Ada.Text_IO.put_line ("에러 발생: " & Ada.Exceptions.exception_message (e));
    raise; -- 처리 중인 예외 e를 그대로 다시 발생시킴
end;

raise 표현식 (expression)

raise 표현식은 문장이 아닌, 다른 표현식의 일부로 사용된다는 점에서 raise 문과 다릅니다. 주로 값을 반환하거나 변수를 초기화해야 하지만, 정상적인 값을 생성할 수 없는 상황에서 예외를 발생시키는 데 사용됩니다. raise 표현식은 어떤 타입이든 만족시킬 수 있으며, 평가될 때 지정된 예외를 발생시킵니다.

raise 표현식이 객체 선언, 타입 정의, 기본값 표현식 등의 일부로 사용될 경우, 반드시 괄호 (``)로 감싸야 하는 문법적 제약이 있습니다.

-- 객체 선언 시 괄호가 필요함
x : Integer := (raise Program_Error);

다음은 변수 result를 초기화할 때, 조건에 따라 정상적인 값을 계산하거나 raise 표현식을 통해 예외를 발생시키는 예입니다.

result : Float := (if X >= 0.0 then
                     -- 조건이 참일 때의 값
                     Ada.Numerics.Elementary_Functions.sqrt(X)
                   else
                     -- 조건이 거짓일 때, raise 표현식이 예외를 발생시킴
                     (raise Constraint_Error with "음수 값에 대한 제곱근은 정의되지 않습니다."));





https://nimfsoft.art/ko/books/ada-programming/#62-%EC%98%88%EC%99%B8-%EB%B0%9C%EC%83%9D%EC%8B%9C%ED%82%A4%EA%B8%B0-raising-exceptions


 



추천 비추천

0

고정닉 0

0

댓글 영역

전체 댓글 0
본문 보기

하단 갤러리 리스트 영역

왼쪽 컨텐츠 영역

갤러리 리스트 영역

갤러리 리스트
번호 제목 글쓴이 작성일 조회 추천
설문 군대 예능 출연해 줬으면 싶은 여자 스타는? 운영자 25/09/15 - -
AD 가전디지털, 액세서리 SALE 운영자 25/09/12 - -
2889678 저번 달에 썼던 미국의 양당정치 스펙트럼 발명도둑잡기(118.216) 09.16 36 0
2889677  C#백엔드인데 [8] 프갤러(39.117) 09.16 118 0
2889675 솔루션 업체면 하는 일이 머임? 프갤러(140.248) 09.16 46 0
2889674 알 만한 사람은 다 아는 유명한 디스곡 발명도둑잡기(118.216) 09.16 48 0
2889672 맥주 660미리 먹었는데 봉지라면 vs 컵라면 뭐먹음?? 총각김치랑 먹음 [3] ㅇㅇ(223.39) 09.16 47 0
2889670 우리집에 피닉스가 왔다 발명도둑잡기(118.216) 09.16 38 0
2889668 이수현 중도보수 민주당 지지자 인터뷰 발명도둑잡기(118.216) 09.16 42 0
2889666 조규찬 7집 - 마지막 돈키호테 발명도둑잡기(118.216) 09.16 29 0
2889665 일하면서 ai 쓰지말라고 공지내려왔다.. [3] cvs.갤로그로 이동합니다. 09.16 94 0
2889664 오늘의 영상 기획 실마리: 지하철 안에서 잠 자는 뮤직비디오 발명도둑잡기(118.216) 09.16 41 0
2889662 20년 전, 미국의 쇠퇴를 예견한 에마뉘엘 토드, '서구의 패배'를 다시 발명도둑잡기(118.216) 09.16 52 0
2889661 맥주 한잔 하고 먹는 라면에 총각김치 왜이렇게 맛있냐?? ㅇㅇ(223.39) 09.16 31 0
2889658 이 사람 아이피 팔도중에 어디임 서울경기 강원 대구 전라도 경상도 중에 프갤러(115.139) 09.16 45 0
2889654 파이썬 잘 아는사람 있음 ㅇㅅㅇ?? 학기문제 알려줘 [4] ㅇㅇ(223.39) 09.16 78 0
2889653 포폴용 [7] ㅇㅇ(125.205) 09.16 76 0
2889650 컴퓨터 파워도 같이 보내면 어쩔까 삼성 파워, 메인보드 시디도 같이 넥도리아(119.195) 09.16 67 0
2889649 ‘케데헌’은 왜 한국이 아닌 미국에서 만들어졌을까 발명도둑잡기(118.216) 09.16 38 0
2889648 Best of Ki-jung | Parasite 발명도둑잡기(118.216) 09.16 31 0
2889647 ❤✨☀⭐⚡☘⛩나로님 퇴근합니당⛩☘⚡⭐☀✨❤ Naro갤로그로 이동합니다. 09.16 37 0
2889646 "처음부터 끝까지 그냥 쓰레기"... 자기 작품을 설명한 예술가의 본심 발명도둑잡기(118.216) 09.16 30 0
2889645 진지하게 주식을 못해서 평생 가난하게 살 확률이 존재하냐?? [2] ㅇㅇ(223.39) 09.16 65 0
2889644 술이 너무 먹고싶다 [1] 주아갤로그로 이동합니다. 09.16 59 0
2889643 새소리 스펙트럼 분석 발명도둑잡기(118.216) 09.16 30 0
2889641 담배 약 술 주아갤로그로 이동합니다. 09.16 37 0
2889640 논문 초록 읽어봤는데 대강 이런 원리라네 [1] ㅆㅇㅆ(124.216) 09.16 131 0
2889638 이제 배달을 빛의 속도로 받을 수 있는거냐? [1] 루도그담당(58.239) 09.16 57 0
2889636 다익스트라 알고리즘은 모든 노드에 대해서 들렀을때 최단거리 아녔나 [2] ㅆㅇㅆ(124.216) 09.16 98 0
2889635 예아 구글이 데이크스트라래 [3] 루도그담당(58.239) 09.16 81 0
2889634 근데 왜 다익스트라라 안하고 데이크스트라라고 하는거냐 [2] ㅆㅇㅆ(124.216) 09.16 73 0
2889632 데이크스트라 알고리즘 깬거 나왔다는데 [3] 루도그담당(58.239) 09.16 83 0
2889629 윤1공주 라 방 뿍뿍(119.202) 09.16 59 0
2889627 초록 뿍뿍(119.202) 09.16 40 0
2889624 뿡뿡 뿍뿍(119.202) 09.16 41 0
2889623 날틀 뿍뿍(119.202) 09.16 40 0
2889622 AI로 Ada 코드 잘 써짐 나르시갤로그로 이동합니다. 09.16 46 0
2889621 아니 jdbc session 이거 좆같네 ㅇㅇ갤로그로 이동합니다. 09.16 39 0
2889618 ‘인공지능이 인류를 말살한다?’ 큰 파장을 낳은 AI2027 보고서 발명도둑잡기(118.216) 09.16 36 0
2889617 <냥육권 전쟁> 한대서 생각나는 예전 글 발명도둑잡기(118.216) 09.16 40 0
2889615 <38사기동대> 있대서 생각나는 예전 글 발명도둑잡기(118.216) 09.16 30 0
2889613 오늘의 출판 기획 실마리: 지하철 온도 민원 등 항의 SMS,이메일 모음 발명도둑잡기(118.216) 09.16 41 0
2889612 ㅆㅇㅆ, 러뻘럼 나 등장하면 빤쓰런하는 이유 나르시갤로그로 이동합니다. 09.16 45 1
2889611 <은수 좋은 날> 한대서 생각나는 예전 글 발명도둑잡기(118.216) 09.16 37 0
2889610 소규모 PG사 vs 솔루션 SI 회사 [1] 프갤러(112.172) 09.16 63 0
2889609 근로기준법으로 1년 휴가 30일로 늘려야돼 프갤러(218.154) 09.16 41 0
2889608 나의 추억(생각하고 싶지 않은 기억) 놓아주려고 하는데 넥도리아(220.74) 09.16 41 0
2889607 [애니뉴스] 귀인환등초 23화 연기 프갤러(121.172) 09.16 45 0
2889606 [애니뉴스] [공지] 서버 다운 현상에 관해서 [3] 프갤러(121.172) 09.16 68 0
2889604 ㅆㅇㅆ은 지옥에나 떨어져라.. [4] 나르시갤로그로 이동합니다. 09.16 88 2
2889603 머리말, 꼬리말 테스트 나르시갤로그로 이동합니다. 09.16 35 0
2889602 ㅆㅇㅆ 이제 6.6, 6.7. 6.8 셋 남았네 나르시갤로그로 이동합니다. 09.16 45 2
뉴스 ‘도라이버’ 조세호, 2세 계획 직접 공개! “당분간 둘만의 시간 보내고 싶어. 좋은 아빠로 헌신 가능할 때 2세 준비” 디시트렌드 09.19
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2