분류
1. 개요
2. 예외의 종류
아래 예외의 종류는 자바 기준으로 작성했으므로 프로그래밍 언어마다 차이점이 있을 수 있다.
- NullPointerException : 흔히 초보 프로그래머들이 자주 하는 실수 중 하나다. 물론 숙련자도 가끔 실수하는 편. null 레퍼런스를 참조할 때 발생한다. 보통 try ~ catch로 예외처리하기 보단 if (a != null)처럼 해당 레퍼런스가 null인지 판단하는 방식으로 처리한다.
- ClassCastException : 변환할 수 없는 타입으로 객체를 변환할 때 발생한다.
- OutOfMemoryException : 메모리가 부족한 경우 발생한다.
- IOException : 입출력 동작 중 인터럽트가 발생할때 나타난다. 자바에서 입출력 함수를 사용하는 경우 반드시 이 예외처리를 해주도록 되어있다.
- NumberFormatException : 문자열이 나타내는 숫자와 일치하지 않는 타입의 숫자로 변환하는 경우 발생한다.
- IllegalArgumentException : 잘못된 인자를 전달하는 경우 발생한다.
- ArrayIndexOutOfBoundsException : 배열의 범위를 벗어나서 접근을 하는 경우 발생한다.
- NoSuchMethodError : 런타임 시점에 존재하지 않는 메서드(method)를 호출할때 발생한다.
위 목록은 자주 나타나는 예외들만 명시해놓았으므로 위 목록 이외에도 수많은 예외가 있다.
개념적인 원인은 다음과 같다.
이 역시 위 목록은 가장 보편적인 예외들만 명시했으므로 위 목록 이외에도 많은 사례가 있다.
3. 프로그래밍 언어에서 예외 처리 방법
3.1. Java
try (Scanner input = new Scanner(System.in)) {
int temp = input.nextInt();
} catch (InputMismatchException e) {
e.printStackTrace();
} catch (Exception e) {
if (e instanceof IOException) {
// TODO: IOException
}
e.printStackTrace();
}
3번 줄에서 정수형 값을 받아 temp 변수에 넣고 있다. 3번 줄을 실행하면서 오류가 발생 시 여러개의 catch 중 오류에 해당되는 Exception의 catch로 이동해서 catch 내에 삽입되어 있는 구문을 실행한다. 만약 오류가 InputMismatchException에 해당되면 5번 줄을 실행하고, 그 외의 오류사항이면 7번 줄을 실행한다.
Exception은 모든 오류를 통합한 형태로, 예외처리가 귀찮은 경우 Exception으로 모두 받아 처리하는 경우가 있는데, 프로그램의 견고함을 떨어뜨릴 수 있으니 되도록 상세한 예외의 명칭을 작성하는 것이 좋다.
3.2. C
using System;
using System.IO;
string context;
try
{
context = File.ReadAllText("test.txt");
} catch (FileNotFoundException)
{
Console.WriteLine("'test.txt' 파일을 찾을 수 없습니다.");
} catch (IOException ex)
{
Console.WriteLine("I/O 오류가 발생했습니다.\n오류 > {0}", ex.Message);
} finally
{
if (context == null)
context = "NO DATA";
}
Console.WriteLine(context);
C#는 Java와 다르게 catch에 Exception 클래스만 넣으면 된다. 또한 finally가 있는데 try 안에 있는 코드 실행이 끝나거나 실행 중에 오류가 발생하면 finally가 호출된다. 이를 통해 간편하게 뒷처리가 가능하다.
3.3. C++
#include <iostream>
int any_value = 999;
int temp;
try
{
std::cin >> temp;
if ( temp == 0 ) throw temp;
}
catch (int exception)
{
std::cout << exception << " 으로 나눌 수 없음" << std::endl;
return;
}
std::cout << any_value / temp << std::endl;