문서:예외 처리

역사 raw
대문 랜덤 문서 최근 토론
1. 개요2. 예외의 종류3. 프로그래밍 언어에서 예외 처리 방법
3.1. [[Java]]3.2. [[C##]] 3.3. [[C++]]

1. 개요

예외 처리(Exception Handling) 혹은 오류 처리(Trouble Shooting)란 실행 흐름상 오류가 발생했을 때 오류를 그대로 실행시키지 않고 오류에 대응하는 방법을 제시하는 개념이나 하드웨어 구조를 의미한다. 일반적으로 프로그래밍에서 프로그램이 실행 중 특정 문제가 발생했을 때 다른 처리 방식으로 흐름을 옮기는 개념으로 사용한다.

2. 예외의 종류

아래 예외의 종류는 자바 기준으로 작성했으므로 프로그래밍 언어마다 차이점이 있을 수 있다.
  • NullPointerException : 흔히 초보 프로그래머들이 자주 하는 실수 중 하나다. 물론 숙련자도 가끔 실수하는 편. null 레퍼런스를 참조할 때 발생한다. 보통 try ~ catch로 예외처리하기 보단 if (a != null)처럼 해당 레퍼런스가 null인지 판단하는 방식으로 처리한다.
  • ClassCastException : 변환할 수 없는 타입으로 객체를 변환할 때 발생한다.
  • OutOfMemoryException : 메모리가 부족한 경우 발생한다.
  • IOException : 입출력 동작 중 인터럽트가 발생할때 나타난다. 자바에서 입출력 함수를 사용하는 경우 반드시 이 예외처리를 해주도록 되어있다.
  • NumberFormatException : 문자열이 나타내는 숫자와 일치하지 않는 타입의 숫자로 변환하는 경우 발생한다.
  • IllegalArgumentException : 잘못된 인자를 전달하는 경우 발생한다.
  • ArrayIndexOutOfBoundsException : 배열의 범위를 벗어나서 접근을 하는 경우 발생한다.
  • NoSuchMethodError : 런타임 시점에 존재하지 않는 메서드(method)를 호출할때 발생한다.

위 목록은 자주 나타나는 예외들만 명시해놓았으므로 위 목록 이외에도 수많은 예외가 있다.

개념적인 원인은 다음과 같다.
  • 잘못된 메모리 장치 접근
  • 불가능한 연산[3]
  • 자료형의 불일치[4]
  • 비논리적인 알고리즘
  • 컴퓨터 하드웨어의 손상
  • 운영체제 손상
  • 존재하지 않는 파일 호출

이 역시 위 목록은 가장 보편적인 예외들만 명시했으므로 위 목록 이외에도 많은 사례가 있다.

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;

[1] 0으로 나누기가 대표적이다.[2] 정수형만 처리 가능한 값에 문자를 넣는 경우 등[3] 0으로 나누기가 대표적이다.[4] 정수형만 처리 가능한 값에 문자를 넣는 경우 등