[목차] == 개요 == 예외 처리(Exception Handling) 혹은 오류 처리(Trouble Shooting)란 실행 흐름상 오류가 발생했을 때 오류를 그대로 실행시키지 않고 오류에 대응하는 방법을 제시하는 개념이나 [[하드웨어]] 구조를 의미한다. 일반적으로 [[프로그래밍]]에서 프로그램이 실행 중 특정 문제가 발생했을 때 다른 처리 방식으로 흐름을 옮기는 개념으로 사용한다. == 예외의 종류 == 아래 예외의 종류는 자바 기준으로 작성했으므로 프로그래밍 언어마다 차이점이 있을 수 있다. * '''NullPointerException''' : 흔히 초보 프로그래머들이 자주 하는 실수 중 하나다. 물론 숙련자도 가끔 실수하는 편. null 레퍼런스를 참조할 때 발생한다. 보통 try ~ catch로 예외처리하기 보단 if (a != null)처럼 해당 레퍼런스가 null인지 판단하는 방식으로 처리한다. * '''ClassCastException''' : 변환할 수 없는 타입으로 객체를 변환할 때 발생한다. * '''OutOfMemoryException''' : 메모리가 부족한 경우 발생한다. * '''IOException''' : 입출력 동작 중 인터럽트가 발생할때 나타난다. 자바에서 입출력 함수를 사용하는 경우 반드시 이 예외처리를 해주도록 되어있다. * '''NumberFormatException''' : 문자열이 나타내는 숫자와 일치하지 않는 타입의 숫자로 변환하는 경우 발생한다. * '''IllegalArgumentException''' : 잘못된 인자를 전달하는 경우 발생한다. * '''ArrayIndexOutOfBoundsException''' : 배열의 범위를 벗어나서 접근을 하는 경우 발생한다. * '''NoSuchMethodError''' : 런타임 시점에 존재하지 않는 메서드(method)를 호출할때 발생한다. 위 목록은 자주 나타나는 예외들만 명시해놓았으므로 위 목록 이외에도 수많은 예외가 있다. 개념적인 원인은 다음과 같다. * 잘못된 메모리 장치 접근 * 불가능한 연산[* [[0으로 나누기]]가 대표적이다.] * 자료형의 불일치[* 정수형만 처리 가능한 값에 문자를 넣는 경우 등] * 비논리적인 알고리즘 * 컴퓨터 하드웨어의 손상 * 운영체제 손상 * 존재하지 않는 파일 호출 이 역시 위 목록은 가장 보편적인 예외들만 명시했으므로 위 목록 이외에도 많은 사례가 있다. == 프로그래밍 언어에서 예외 처리 방법 == === [[Java]] === {{{#!syntax 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으로 모두 받아 처리하는 경우가 있는데, 프로그램의 견고함을 떨어뜨릴 수 있으니 되도록 상세한 예외의 명칭을 작성하는 것이 좋다. === [[C##]] === {{{#!syntax csharp 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가 호출된다. 이를 통해 간편하게 뒷처리가 가능하다. === [[C++]] === {{{#!syntax cpp #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; }}} [[분류:프로그래밍]]