디시인사이드 갤러리

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

갤러리 본문 영역

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

나르시갤로그로 이동합니다. 2025.09.02 04:45:55
조회 104 추천 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/09/22 - -
AD 가전디지털, 액세서리 SALE 운영자 25/09/12 - -
2890036 저 병신은 내가 정보글에 볼드체 얼마나 썼는데 [1] ㅆㅇㅆ찡갤로그로 이동합니다. 09.18 61 0
2890035 갑자기 밥이 땡기네... ㅠㅠ 넥도리아(220.74) 09.18 38 0
2890034 부자들은 해외여행 가서 관광지 걸어다니며 노는데 발명도둑잡기(118.235) 09.18 41 0
2890033 나님 애널 피궁해서 일찍 주무실게양⭐+ ♥냥덩이♥갤로그로 이동합니다. 09.18 37 0
2890032 지피티 볼드체 복사하면 병신아 마크다운 문법으로 ㅆㅇㅆ찡갤로그로 이동합니다. 09.18 52 0
2890031 ㅆㅇㅆ의 심각한 확증 편향, 증거 유 나르시갤로그로 이동합니다. 09.18 38 2
2890030 후 시발 도저히 못참겠다. [2] 프갤러(42.18) 09.18 65 0
2890029 121.139가 나르시 아니라고? ㅆㅇㅆ찡갤로그로 이동합니다. 09.18 41 0
2890027 ㅆㅇㅆ 볼드체 지울려고 자삭한거 아님? ㅋㅋㅋㅋㅋㅋㅋ [2] 프갤러(51.158) 09.18 70 2
2890026 일본에서 소설 원작 영화 <국보> 흥행으로 생각나는 예전 글 발명도둑잡기(118.235) 09.18 63 0
2890025 자, 이게 내 화면이다. ㅆㅇㅆ 차단해 놓은지 오래다 [2] 나르시갤로그로 이동합니다. 09.18 62 1
2890024 그간 현장 뛰냐고 피곤해서 한숨 자고 일어났더니.. ㅎㅎ 나르시갤로그로 이동합니다. 09.18 31 0
2890022 ㅆㅇㅆ아, 내가 전에 확인시켜준 IP랑 동일하지? 나르시갤로그로 이동합니다. 09.18 37 1
2890021 ㅆㅇㅆ 내가 원래 유동으로 글 안 쓰는데, IP 확인 시켜주마. [1] 나르시(112.168) 09.18 48 1
2890020 ㅆㅇㅆ아, 121.139가 내가 아닌 이유 알려주마 나르시갤로그로 이동합니다. 09.18 71 1
2890019 근데 여기 프로그래밍갤 맞음? ㅇㅇ(118.235) 09.18 42 0
2890018 ㅆㅇㅆ아.. 제발 착각하지마 나르시갤로그로 이동합니다. 09.18 46 1
2890017 ❤✨☀⭐⚡☘⛩나님 시작합니당⛩☘⚡⭐☀✨❤ ♥냥덩이♥갤로그로 이동합니다. 09.18 32 0
2890016 Llm복붙쳐하면서 알지도 못하면서 신고삭제는 왜하냐 [1] ㅆㅇㅆ찡갤로그로 이동합니다. 09.18 59 1
2890014 121.139 지 반박한거 싹다 신고했노 좆병신이ㅋㅋ ㅆㅇㅆ찡갤로그로 이동합니다. 09.18 53 1
2890012 인텔리제이 울티메이트 시대는 끝났다 ㅇㅇ(223.38) 09.18 39 0
2890011 라이브코테하는데 경악하더라 ㅇㅇ(118.235) 09.18 113 0
2890009 우테코가 코테가 어려운편인가? ㅇㅇ(118.36) 09.18 109 0
2890008 html,css,javascript국비 일주일이면고수됨?? [1] 타이밍뒷.통수한방(1.213) 09.18 56 0
2890007 친구가 vim써야 타자수 올라가서 코딩 빨라진다는데 뭐냐 [2] 브르르브르르파타핌갤로그로 이동합니다. 09.18 59 0
2890006 32비트는 커널 패치를 해도 상관없는데 루도그담당(211.184) 09.18 43 0
2890004 나르시 루비 아니면 깃갤가서 놀아라 [1] 프갤러(175.208) 09.18 46 0
2890003 STA ㅈ같네 진짜 [2] ㅇㅇ갤로그로 이동합니다. 09.18 57 0
2890002 인간은 무의식적으로 추상화 레벨을 조절함. 내가 설명해준다. [2] ㅆㅇㅆ(124.216) 09.18 87 2
2890001 지옥에 있는 강유현 나와라 [3] 프갤러(121.190) 09.18 60 0
2890000 점마 루비인거 뻔히 보이는데 자꾸 시발 루비 빠는거보면 기가 참ㅋㅋ ㅆㅇㅆ(124.216) 09.18 40 0
2889996 인프런 강의 30% 할인이 가장 크게 할인 하는 거임? ㅇㅇ(211.234) 09.18 195 0
2889992 ❤✨☀⭐⚡☘⛩나님 시작합니당⛩☘⚡⭐☀✨❤ ♥냥덩이♥갤로그로 이동합니다. 09.18 39 0
2889991 러스트 코드는 왜 병신인가? [1] 나르시갤로그로 이동합니다. 09.18 49 0
2889990 저는 사실 고급인력입니다. 걧돈슈킹예아(119.202) 09.18 45 0
2889989 마시써 [1] 걧돈슈킹예아(119.202) 09.18 42 0
2889988 진짜 다들 회까닥 돌았지. llm이 코드 잘 짜준다고 언어를 정하다니 [1] 프갤러(218.154) 09.18 74 0
2889987 ㅋㅋㅋ ㅆㅇㅆ 이새끼 존나 골떄리는놈이네 [3] 프갤러(121.139) 09.18 154 6
2889986 회사코드 확 riir해버리고 싶다. [3] 프갤러(218.154) 09.18 60 0
2889985 나는 저능아이지만 [1] 걧돈슈킹예아(119.202) 09.18 47 0
2889984 러스트 시비거는 놈들도 개병신 저능아들만 시비 걸더라고 [3] 프갤러(218.154) 09.18 50 0
2889983 인생 개좇되로 사는새끼들이 더 잘사누 우연일까 뒷통수한방(1.213) 09.18 43 0
2889982 나는 왜 좆 저능아새끼들이 시비걸까 [4] ㅆㅇㅆ(124.216) 09.18 78 0
2889981 저능아들이 AI가 망치로 때린다는 뜻을 의미를 이해 못함 원리를 몰라서 ㅆㅇㅆ(124.216) 09.18 76 0
2889979 결국 ai근간 자체가 경사하강법이라 ㅆㅇㅆ찡갤로그로 이동합니다. 09.18 55 0
2889978 AI 쓸수록 결국 프로그래밍 추상화 방법 잘 아는 내 가치가 올라서 좋아 [2] ㅆㅇㅆ(124.216) 09.18 93 0
2889977 하루에 오조오억줄 감사의 코딩 [6] 공기역학갤로그로 이동합니다. 09.18 79 0
2889976 대학생으로 다시 돌아간다면 [3] 루도그담당(118.235) 09.18 64 0
2889975 필연적으로 느끼는게 AI 쓰는 사람이 많아질수록 내 가치가 오름 ㅆㅇㅆ(124.216) 09.18 52 0
2889974 요즘은 LLM CLI 세팅 자체를 그냥 자동화해놓으니 이거 관련한 문의가 [2] ㅆㅇㅆ(124.216) 09.18 74 0
뉴스 하지원, 47세 탄탄한 몸매와 동안 미모로 등장...“나이를 잊은 여전한 여신” 디시트렌드 09.20
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2