[목차] == 사전적 의미 == 어떤 일에 제외되는 대상이나 조건이 있을 때 쓰는 단어. == 프로그래밍 용어 == === 개요 === 프로그래밍 언어에서 명령을 실행할 시, 입력 값과 계산 대상의 자료형을 함수에서 지원하지 않거나, 함수에서 대상을 계산할 수 없을 때 나오는 오류. 프로그래밍 시 이를 미리 예측하고 그에 대한 대처법을 만들어 두어야 한다.. 대부분의 언어는 직접 예외를 발생시킬 수도 있다. ==== 예제 ==== ===== [[C++]] ===== {{{#!syntax cpp try { // 예외 던지기 throw 0; } catch (int x) { // 수행할 작업 } }}} 추가로, C++에는 예외 사양(exception specification)이라는 것이 존재한다. 한정자의 일부인데, 이것이 지정되면 함수는 지정된 타입의 예외밖에 던지지 못한다. 하지만 이 예외 사양이 지정되어도 강제성이 거의 없다시피하여 실제로 예외 사양이 추가된 목적을 달성하기 어렵다. 따라서 이 예외 사양은 비권장 사항(deprecated)이 되었으며, 실제로 대부분의 현대 C++ 컴파일러는 이 예외 사양에 경고 내지 메세지를 준다. 하지만 예외 사양의 필요성은 많은 C++ 프로그래머 사이에서 인정되었으며 그 요구에 따라 C++11부터는 noexcept 한정자/연산자가 추가되었다. 이름에서 알 수 있듯이 예외 사양을 던질수 있음/없음으로 이분한 형태이다. 이 한정자가 적용된 함수는 예외를 던지지 못하며 던질시 즉시 std::terminate가 호출된다. 기본 핸들러를 가진 예외 사양과 같은 동작인데, 다른 점은 noexcept는 stack unwind를 할 수도 있고 안할수도 있다는 것이다. 이는 컴파일러 최적화에 큰 도움을 준다. 이걸 사용하면 강한 예외 보장성을 쉽게 제공(이를 제공하지 않으면 C++11에 추가된 move semantics를 제대로 사용할 수 없다.) 할 수 있고, 최적화에도 도움이 된다. 아직 이 한정자는 타입 시스템의 일부가 아니며, C++17부터 함수 타입 시스템의 일부가 될 예정이다. noexcept 연산자는 피연산자가 noexcept specified인지 아닌지를 컴파일 타임에 확인하고, bool 형식으로 반환한다. ===== [[C\#]] ===== {{{#!syntax csharp try { // 예외 던지기 throw new Exception(); } catch (Exception e) { // 수행할 작업 } finally { // 반드시 수행할 작업 } }}} C#에서는 Exception 클래스를 상속하는 객체만 예외로 던지고 받을 수 있게 강제되어 있다. 만약 그 외의 변수나 객체를 던지려고 하면 컴파일러에서 거부한다. 그리고 [[Java]]와 같이 finally문이 추가되었는데 필수는 아니지만 예외를 받았건 받지 않았건 메모리 해제처럼 반드시 실행시켜야만 하는 명령이 있을 경우 사용한다. ===== [[Java]] ===== {{{#!syntax java try { // 예외 던지기 throw new Exception(); } catch (Exception e) { // 수행할 작업 } finally { // 반드시 수행할 작업 } }}} C#과 다른 점이 없다고 생각할 수도 있는데 사실이다. C#이 Java문법을 참고했기 때문이다. Java에서는 아에 예외 검사를 컴파일러에 넣어버려서 예외를 받아내지 않으면 컴파일이 거부된다. 다만 이것이 워낙 귀찮다보니 catch (Exception e) {throw e;} 처럼 받은 예외를 되던져서 떠넘겨 버리는 사람도 있다. 다만 이런 방법은 권장되는 방법은 아니다. 사소한 문제 때문에 예외를 던졌는데 강제로 예외 처리를 하게 하는 것을 방지하려면 RuntimeException클래스를 상속하는 객체를 던지면 된다. ===== [[Python]] ===== {{{#!syntax python try: # 예외 던지기 raise BaseException except BaseException as e: # 수행할 작업 finally: # 반드시 수행할 작업 }}} [[분류:프로그래밍 언어 문법]]