본문 바로가기

Programming Languages [PL]

[PL] 12. Exception Handling and Event Handling

기본 개념

Exception

하드웨어 또는 소프트웨어에서 감지될 수 있는 비정상적인 이벤트. 

에러일 수도 있고 에러가 아닐 수도 있다.

보통 특별한 처리가 필요할 수 있다.

 

Exception handling

예외가 감지된 후에 필요한 특별한 처리

 

Exception handling을 해주는 code unit(코드 단위)은 exception handler라고 부른다.


예외 Exception

예외(상황)란?

  • 심각하지 않은 오류 혹은 비정상적 상황
  • 예외 발생 시 계속 수행할 수 있도록 처리해야 함
  • 발생된 예외를 처리하지 못하면 프로그램 종료

예외에 대한 적절한 처리

  • 안전한 프로그램 실행을 위해 매우 중요
  • C++, Java, Python 등 최신 언어들은 예외 관련 기능을 제공함
     -> Reliability가 아니라 Readability가 높다. C는 try-catch를 지원하지는 않지만, 예외 처리를 할 수는 있음

필요한 예외 관련 구문

  • 예외 정의
  • 예외 발생
  • 예외 처리

재개 모델 resumption model

  • 예외가 발생하면 예외 처리 후 예외를 발생시킨 코드로 재개하여 계속 실행
  • 즉 (1) 지점에서 예외가 발생했을 때 (1) -> (3) -> (2) 순으로 실행

종료 모델 termination model -> 일반적인 모델

  • 예외가 발생하면 예외 처리 후 예외를 발생시킨 코드로 재개하지 않고
  • try 문을 끝내고 다음 문장을 실행. 즉 (1) -> (3) -> (4) 순으로 실행

Exception Handling

예외 처리 기능이 없는 언어

Reliability가 낮다.

예외가 발생하면 제어는 OS로 이동하고 메시지가 표시되며 프로그램이 종료된다.

 

예외 처리 기능이 있는 언어

프로그램은 몇 가지 예외를 허용하고 문제를 해결하고 계속 진행할 가능성을 제공한다. 


Exception Handling의 대안

예외는 관련된 이벤트가 발생할 때 raise된다.

예외 처리 기능이 없는 언어도 (사용자 정의된, 소프트웨어가 감지한) 예외를 정의, 감지, 발생, 처리할 수 있다.

 

대안

  • 보조 매개변수(auxiliary parameter)를 전송하거나 서브 프로그램의 리턴 상태를 알리기 위해 리턴 값을 이용한다.
  • 모든 서브 프로그램에 레이블 매개변수를 전달한다. (오류 반환은 전달된 레이블로 이루어진다.)
  • 예외 처리를 하는 서브 프로그램을 모든 서브 프로그램에 전달한다.

Built-in Exception Handling의 장점

예외 감지 코드는 작성하기 번거롭고 프로그램을 혼란스럽게 만들 수 있다.

예외 처리는 프로그래머들이 다양한 가능한 오류들을 고려하도록 한다.

 

Exception Propagation은 예외 처리 코드의  높은 수준의 재사용을 허락한다. 

A->B->C->D 의 구조에서 D의 try-catch에서 에러가 감지되지 않았다면

 

dynamic link를 따라 C에서도 감지를 요청하고 B->A->Main으로 이어진다.