디시인사이드 갤러리

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

갤러리 본문 영역

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

나르시갤로그로 이동합니다. 2025.09.16 02:22:29
조회 60 추천 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/22 - -
AD 가전디지털, 액세서리 SALE 운영자 25/09/12 - -
공지 프로그래밍 갤러리 이용 안내 [96] 운영자 20.09.28 47357 65
2891030 연예인 딥 페이크 성인물 어떻게 찍는거임? 너무 99.99% 일치한데? 넥도리아(220.74) 17:18 1 0
2891029 어차피 대부분 쉐이더는 권장 문법이라는게 있어서 쓰는 문법이 비슷해 [2] ㅆㅇㅆ(124.216) 17:15 13 0
2891028 shader lab 써도 되고 그냥 hlsl 기반인 유니티 [3] ㅆㅇㅆ(124.216) 17:10 22 0
2891027 제 인생 암만 남한테 물어봐도 의미없죠?? 닥치고 할일이나 할까요?? ㅇㅇ(223.39) 17:08 5 0
2891026 쉐이더 그래프 이거 어렵냐? [4] 루도그담당(118.235) 17:08 15 0
2891025 확실히 WSL 키고 코덱스 쓰니까 속도 존나 빠르네 ㅆㅇㅆ(124.216) 17:02 11 0
2891024 유니티 잘하고 싶다 [2] 루도그담당(118.235) 16:58 28 0
2891023 ❤✨☀⭐⚡☘⛩나님 시작합니당⛩☘⚡⭐☀✨❤ ♥냥덩이♥갤로그로 이동합니다. 16:57 7 0
2891022 아 몰랐는데 Rancher Desktop은 디스트로가 [2] ㅆㅇㅆ(124.216) 16:48 19 0
2891021 바보 새끼들 ㅋㅋ [1] 프갤러(121.139) 16:40 27 1
2891020 금연하면 피로감 줄어들고 체력 올라감?? ㅇㅇ(223.39) 16:40 10 0
2891019 4년차 580에 이직했는데 대박친거냐? [2] ㅇㅇ갤로그로 이동합니다. 16:38 32 0
2891018 소넷 개별로네 [2] 프갤러(211.224) 16:31 17 0
2891017 성실은 기본만큼은 하는것 프갤러(211.234) 16:27 16 0
2891016 성실과 노력의 가치는 안될때도 이악물고 하는것을 얘기하나... ㅇㅇ(223.39) 16:05 11 0
2891015 꿀팁) 친중매국 반미극좌 CIA에 신고하는법 ♥냥덩이♥갤로그로 이동합니다. 16:04 9 0
2891014 <트럼프를 믿는 건 미친 짓> 발명도둑잡기(118.216) 15:58 7 0
2891013 오랜만이다 친구들아 [2] 아스카영원히사랑해갤로그로 이동합니다. 15:46 30 0
2891012 행님들 팅커캐드 학교과제로 하고있는데 코드가 잘 안짜집니다 도움좀 ㅠ [5] 프갤러(223.194) 15:31 61 1
2891010 ❤✨☀⭐⚡☘⛩나님 시작합니당⛩☘⚡⭐☀✨❤ ♥냥덩이♥갤로그로 이동합니다. 15:06 15 0
2891009 전산직 이직하니 개발은거의 안하네 [1] 프갤러(115.21) 15:05 40 0
2891008 나님 리포스팅된거 3만명 ㄷㅅㄷ ♥냥덩이♥갤로그로 이동합니다. 14:49 26 0
2891007 배뷰르니 노곤노곤 ♥냥덩이♥갤로그로 이동합니다. 14:27 16 0
2891006 무능좌파 이재명 탄핵 ♥냥덩이♥갤로그로 이동합니다. 14:22 20 0
2891005 ❤✨☀⭐⚡☘⛩나님 시작합니당⛩☘⚡⭐☀✨❤ ♥냥덩이♥갤로그로 이동합니다. 14:22 16 0
2891004 아니 말하는거보면 지식도 부족함..문제가...121.139 점마는 [2] ㅆㅇㅆ(124.216) 14:17 45 0
2891003 121.139 << 이 새끼 이해 안 가는 점 [1] 루도그담당(58.239) 14:11 49 0
2891002 병신끼리 똥꼬나 빨아라 ㅋㅋ [1] 프갤러(121.139) 14:02 46 1
2891001 프로그래밍이 재미없는 이유 프갤러(218.154) 14:01 28 0
2891000 조나단 느그홍 나중에 나라 경기 호황이면 그때 장관하자 뒷통수한방(1.213) 14:01 11 0
2890999 취직의 단점은 자기가 좋아하는 일을 할 수가 없다는게 크지 ㅆㅇㅆ(124.216) 14:01 21 0
2890998 굳이 저새끼 병신임 할 필요 없음 [1] 프갤러(218.154) 13:59 29 0
2890997 121.139 쟤 장애인이라 걍 무시해라 유동아. ㅆㅇㅆ(124.216) 13:57 18 0
2890996 아 맞네 연휴는 즐기고 그만둬야되네 ㅋㅋ 프갤러(218.154) 13:53 20 0
2890994 이제 프로그래밍이 재미없다.. [11] 프갤러(221.165) 13:41 98 0
2890993 돈이 나쁘다고하는 좌빨새끼가 가장 돈에 미친새끼당 By 나님 ♥냥덩이♥갤로그로 이동합니다. 13:30 20 0
2890992 지구가 너무 작아보여 ♥냥덩이♥갤로그로 이동합니다. 13:28 19 0
2890990 갠적으로 학생 동적배포 프로젝트를 난 render로하거든 ㅆㅇㅆ찡갤로그로 이동합니다. 12:44 26 0
2890989 본질에 집중하라 ♥냥덩이♥갤로그로 이동합니다. 12:35 29 0
2890987 ❤✨☀⭐⚡☘⛩나로님 시작합니당⛩☘⚡⭐☀✨❤ [1] Naro갤로그로 이동합니다. 12:29 22 0
2890986 uxui 디자인, 프론트엔드 국비 프갤러(1.215) 12:25 36 0
2890984 피터팬증후군 좌폐아 영포티 ㅠ ♥냥덩이♥갤로그로 이동합니다. 12:07 22 0
2890983 웹3.0시대 언제옴? 타이밍뒷.통수한방(1.213) 12:03 29 0
2890981 ES 모듈을 기본적으로 async/await 패턴을 적극적으로 [2] ㅆㅇㅆ(124.216) 11:54 46 0
2890980 [환상초한전] 제 1장 : 비틀린 스토리 (3) 프갤러(121.172) 11:52 16 0
2890979 불변 배열 매서드를 써라...! ㅆㅇㅆ(124.216) 11:51 26 0
2890978 내가 즃센을 파악한 10년전 뒷통수한방(1.213) 11:48 25 0
2890976 인텔 저전력 모바일 프로세서에 64긱 필요함 ♥냥덩이♥갤로그로 이동합니다. 11:34 36 0
2890975 개발 하지마라 취업 안된다. [9] 프갤러(112.148) 11:30 127 0
뉴스 출산 1년 후 비공개 결혼하는 여배우… 2년 열애 신랑은 누구 디시트렌드 10:00
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2