Introduction to Exception Handling
예외 처리가 불가능하다면, 예외가 발생했을 때 제어권은 운영체제로 이동하고, 에러 메세지가 표시되며 프로그램은 종료된다. 반면에 예외 처리가 가능하다면, 프로그램은 몇몇 예외에 대하여 적절한 처리를 함으로써 프로그램이 종료되지 않고 계속 실행될 수 있도록 할 수 있다.
예외(Exception)은 드물게 발생하는 이벤트로, 하드웨어나 소프트웨어에 의해 발견되며 특별한 처리가 필요하다. 이 특별한 처리를 exception handling이라고 부르며, 예외가 발견된 이후에 예외를 처리하는 코드 단위인 exception handler에 의해 진행된다.
Exception Handling Alternatives 예외 처리가 불가능한 경우 대안들
- 보조 파라미터를 사용하거나, 서브프로그램에서 발생한 문제 상황에 따른 예외 코드를 리턴하도록 한다.
- 예외 발생 시 특정 label parameter로 이동하여 처리하도록 한다.
- exception handling이 가능한 서브프로그램에 넘긴다.
Advantages of Built-in Exception Handling 내장 예외 처리의 장점
- 에러를 추적하는 코드를 작성하는 것은 매우 번거로운데, 예외 처리가 내장되어 있다면 이런 코드를 작성하지 않아도 된다.
- 개발자로 하여금 발생할 수 있는 다양한 에러를 고려하여 코드를 작성하도록 한다.
- 나를 호출한 쪽으로 예외를 전달함으로써 예외 핸들링 코드를 상위 레벨에서 재사용할 수 있다.
Exception Handling Examples in Some Languages
1. C++
try {
// code that is expected to raise an exception
} catch (formal parameter) { // formal parameter에는 타입 이름만 명시.
// 예외 발생 시 가장 위의 catch문부터 차례대로 formal parameter를 확인하며
// 발생한 예외와 맞는 formal parameter를 가진 catch문을 실행함
// handler code
} catch (formal parameter) {
...
} catch (formal parameter {
// handler code
}
- formal parameter: 각 catch 문에 들어가는 formal parameter는 고유해야 하며, 변수 이름 없이 타입명만 들어가도 된다. handler에 예외에 대한 정보를 전달하는 용으로 사용된다. 생략 가능하며, 이 경우 위에서 핸들되지 않은 남은 예외를 핸들하게 된다.
- throwing exceptions: 예외를 고의적으로 발생시킬 수 있다. expression 없이 작성하는 경우는 핸들러 안에서만 다시 예외를 발생시킬 때만 허용된다.
throw [ expression ];
- 핸들러가 실행된 후, 제어 흐름은 마지막 핸들러의 끝으로 이동한다.
- 처리되지 않은 예외는 예외가 발생한 함수를 타고 main 함수까지 전파된다. 핸들러가 발견되지 않는다면 기본 핸들러가 호출된다.
2. Java
C++을 베이스로 OOP를 한스푼 섞은 형태다. 모든 예외들은 Throwable 클래스의 자손 클래스다. Throwable 클래스는 2개의 하위 클래스를 갖는다.
- Error: 사용자에 의해 핸들되지 않는다.
- Exception: 사전에 정의된 2개의 하위 클래스(IOException, RuntimeException)를 갖는다. 사용자가 정의한 예외들은 보통 이 클래스의 하위 클래스다.
- C++와는 다르게, formal parameter 자리에 이름이 있으며 Throwable 클래스의 자손 클래스인 파라미터가 와야 한다.
- 에러를 발생시킬 때 new 키워드와 함께 exception 객체를 생성해 발생시킨다.
throw new MyException();
- try 문에서 핸들러를 찾지 못하면 가장 가까운 try문을 계속 탐색하며 핸들러를 찾는다. 만약 해당 메서드에서 핸들러를 찾지 못하면 해당 메서드를 호출한 곳으로 예외가 전파된다. 끝까지 핸들러를 찾지 못하면 프로그램이 종료된다.
- 모든 예외를 처리하길 원한다면 try 구조문의 가장 마지막에 Exception 클래스에 대한 예외 처리 핸들러를 추가해주면 된다.
- unchecked exceptions: Error와 RunTimeException과 얘네들 자손 클래스들이다.
- checked exceptions: unchecked exceptions를 제외한 모든 예외는 checked exceptions다. checked exceptions는 throws 절에 포함시켜 caller 쪽에서 해결하거나, 메서드 안에서 직접 예외 처리를 해주어야 한다. 해주지 않으면 컴파일 에러가 발생한다.
- 부모 클래스가 throws 하지 않는 예외를 자식 클래스가 throws할 수 없다.
- 예외를 throws하는 메서드를 호출하는 메서드에서는 예외를 처리하기 위한 3가지 대안을 가진다:
- 내가 직접 예외를 처리한다(try / catch).
- 핸들러 안에서 다시 예외를 throw한다. -> 보통 발생한 예외와 다른 타입의 예외를 발생시킨다.
- 내 throws 절에 예외를 추가하고, 나를 호출한 caller에게 책임을 전가한다.
- finally: try 구조가 끝나는 부분에 작성한다. try 안의 명령문의 정상적 실행 여부와 상관없이 무조건 실행된다.
try {
for (int i = 0; i < 13; i++) {
...
if ( ... ) return;
}
}
finally {
// do something
} // end of try construct
- assert: 실행 중 상태값을 확인하는 용도다. condition이 참이면 넘어가고, 거짓이면 AssertionError가 발생한다. 두번째 문장은 condition이 거짓이면 expression의 값이 예외 메세지로 보여진다.
assert condition;
assert condition: expression;
Introduction to Event Handling
Event는 바우스 클릭이나 그래픽 버튼이 클릭되었을 때처럼 특별한 일이 발생했을 때의 알림이다. event handler는 이벤트에 응답하여 실행되는 코드의 세그먼트다.
The Java Event Model
- GUI 컴포넌트와 사용자의 상호작용은 event listeners가 감지 가능한 이벤트를 만들어 낸다.
- event listeners는 인터페이스로 작성되어 있으며, 사용자가 표준 프로토콜에 맞춰 이벤트를 핸들링할 수 있도록 한다. 리스너를 구현하는 클래스는 해당하는 리스너를 implement해야 한다.
'강의노트' 카테고리의 다른 글
[2021-1 운영체제] Chapter 3: 프로세스와 스레드 (1) | 2021.06.18 |
---|---|
[2021-1 프로그래밍언어론] Chapter 12: Object-Oriented Programming (0) | 2021.06.01 |
[2021-1 프로그래밍언어론] Chapter 11: Abstract Data Types and Encapsulation Constructs (0) | 2021.06.01 |
[2021-1 프로그래밍언어론] Chapter 10: Implementing Subprograms (0) | 2021.05.30 |
[2021-1 데이터마이닝및분석] Chapter 2: Data (3) Similarity (0) | 2021.04.16 |