디시인사이드 갤러리

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

갤러리 본문 영역

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

나르시갤로그로 이동합니다. 2025.09.16 02:22:29
조회 67 추천 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 - -
이슈 ‘용원게이’를 넘어 배우 장용원으로 운영자 25/09/23 - -
2891516 빠는 언어 하나 없으면 그냥 개발자 인생 헛살았다고 봅니다. [4] 프갤러(218.154) 09.24 47 0
2891515 봐. 이렇게 괴롭히잖아. 나르시갤로그로 이동합니다. 09.24 22 0
2891514 러슬람이랑 루비 루도그담당(211.184) 09.24 32 0
2891513 개발자판 만들고 싶은거 만들라는 세상좋은소리 믿어도 되는건가요?? ㅇㅇ(221.153) 09.24 17 0
2891512 독거로 나이먹어가면 저렇게 변하는구나 사람이 프갤러(121.129) 09.24 24 1
2891511 러스트는 신규 레거시일 뿐입니다. 아무도 안 써요 ㅎㅎ 나르시갤로그로 이동합니다. 09.24 22 0
2891510 c cpp 가지고 싸우지 말고 러스트나 하십쇼 프갤러(218.154) 09.24 26 0
2891509 ㅎㅎㅎ GPT를 발렸습니다. ㅋㅋ [14] 나르시갤로그로 이동합니다. 09.24 70 0
2891508 아무리 생각해봐도 동적 타입은 쓸게 못된다. [2] 프갤러(218.154) 09.24 40 0
2891507 뭐냐 디시에 개죽이 나오는거 [5] 루도그담당(58.239) 09.24 50 0
2891506 보석새끼 지가 하던 짓 똑같이 당하고 있나보네 프갤러(218.154) 09.24 26 0
2891505 ❤✨☀⭐⚡☘⛩나님 시작합니당⛩☘⚡⭐☀✨❤ ♥냥덩이♥갤로그로 이동합니다. 09.24 21 0
2891504 Cpu만 이제 바꾸면되는데 씨피유 이거 밀면 ㅆㅇㅆ찡갤로그로 이동합니다. 09.24 23 0
2891503 어제한거 정리해서 보내줘야하는데 넘힘들다 [3] ㅆㅇㅆ(124.216) 09.24 36 0
2891502 고소 드립 == 패배 선언 프갤러(125.131) 09.24 26 0
2891501 일론머스크, 주커버그, 빌게이츠같은 애들은 경영자임 공학자임?? ㅇㅇ(221.153) 09.24 23 0
2891500 ■개발컴에 CPU랑 RAM 중 뭐가 더 중요함? ㅇㅇ갤로그로 이동합니다. 09.24 24 0
2891499 ❤✨☀⭐⚡☘⛩나님 시작합니당⛩☘⚡⭐☀✨❤ ♥냥덩이♥갤로그로 이동합니다. 09.24 23 0
2891498 확실히 여기가 국비 웹떌깜 갤러리구나 프갤러(125.130) 09.24 27 0
2891497 나는 김호동이다. 사진有 사이버 스토킹/범죄 계속하면 고소하겠다. [50] 나르시갤로그로 이동합니다. 09.24 50 1
2891495 125.128 너 진짜 왜 AI로 나를 음해하는데 사용하니? [1] 나르시갤로그로 이동합니다. 09.24 30 0
2891494 어제 Ada 3장 어휘 요소 목차를 다음처럼 뽑았었죠 ㅎㅎ [2] 나르시갤로그로 이동합니다. 09.24 22 0
2891493 GPT Pro야 '나르시'의 성향을 평가해봐 프갤러(125.128) 09.24 28 3
2891492 ↓ 밑에 나르시 조현병 똥글의 GPT Pro의 반박 프갤러(125.128) 09.24 31 0
2891491 ㅋㅋㅋ GPT한테 물어봐도 c/c++ 유래, 내 말이 맞잖아 ㅋㅋ [2] 나르시갤로그로 이동합니다. 09.24 39 0
2891490 무조건 반대만 하는 정신병은 어떻게 고침? ㅇ ㅅㅇ; [1] 프갤러(60.196) 09.24 28 0
2891489 ↓ 밑에 나르시 망상병 똥글의 GPT Pro의 반박 프갤러(125.128) 09.24 28 0
2891488 결국 ChatGPT도 c/c++ 표기에 대한 저의 의견을 뒷받침하는군요. [1] 나르시갤로그로 이동합니다. 09.24 33 0
2891487 나르시 망상병에 대한 GPT Pro의 반박 프갤러(125.128) 09.24 31 0
2891486 다시보는 C++ 환자 ㅎㅎ 나르시갤로그로 이동합니다. 09.24 38 0
2891485 Agi가 완벽하게 바로 등장하는게 아니라.. [1] ㅇㅇ(175.208) 09.24 34 1
2891484 노동 해방이 빨리 왔으면 좋겠다 ㅇㅇ(211.219) 09.24 17 0
2891483 C++ 환자들 난리 나셨나 봅니다. ㅎㅎ 나르시갤로그로 이동합니다. 09.24 22 0
2891482 MS조차 사용하는 C/C++ 표기 ㅎㅎ 이게 틀렸다고??? [5] 나르시갤로그로 이동합니다. 09.24 53 0
2891481 어제부터 나랑 사귄 여친 사진인데 어떠냐 메쿠이료갤로그로 이동합니다. 09.24 22 1
2891480 ❤✨☀⭐⚡☘⛩나님 시작합니당⛩☘⚡⭐☀✨❤ ♥냥덩이♥갤로그로 이동합니다. 09.24 25 0
2891479 증거 有) 내가 GPT 안 쓰고 제미니 쓰는 이유 ㅋㅋ [2] 나르시갤로그로 이동합니다. 09.24 46 0
2891478 c/c++ 표기의 유래 업뎃 및 gpt 글에 대한 반박 ㅋㅋ [2] 나르시갤로그로 이동합니다. 09.24 41 0
2891477 [대한민국] 트럼프 대통령 UN 연설 영어 원문 프갤러(121.172) 09.24 27 0
2891476 sd카드 에뮬레이터 발명도둑잡기(118.216) 09.24 26 0
2891475 [취업 완성반] 엘리스 프론트엔드 인턴연계 부트캠프 4기 모집 (~10/ 프갤러(14.32) 09.24 39 0
2891474 나르시님 저렴한 싸구려모델 제미나이 쓰나보네요 프갤러(121.168) 09.24 25 0
2891473 1인컴공 졸작 낮은 수준이어도 통과해주냐 [3] ㅇㅇ(125.182) 09.24 72 0
2891472 징벌적 과징금으로 파산시키고 정부가 지분 매입해서 프갤러(218.154) 09.24 36 0
2891471 보안 사고내면 회장 일가 참수하고 벌금으로 파산시켜야 [3] 프갤러(218.154) 09.24 46 0
2891470 3. 업계의 표준적 사용, 요부분은 수정하죠 [2] 나르시갤로그로 이동합니다. 09.24 52 0
2891469 보안 인재 양성 1년에 고작 40명…심각해진 ‘인력 가뭄’ ㅇㅇ(106.102) 09.24 43 0
2891468 나르시 -> C/C++ 똥글 반박 [5] 프갤러(121.168) 09.24 145 10
2891467 뉴비 관리해라 프갤러(219.248) 09.24 29 0
2891466 ❤✨☀⭐⚡☘⛩나님 시작합니당⛩☘⚡⭐☀✨❤ ♥냥덩이♥갤로그로 이동합니다. 09.24 22 0
뉴스 투모로우바이투게더 수빈·최윤지·추영우, 따뜻한 매력 담은 커버낫 플리스 캠페인 ‘WARM ON’ 디시트렌드 09.25
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2