예외
최근 수정 시각: (5년 전)
1. 사전적 의미 [편집]
어떤 일에 제외되는 대상이나 조건이 있을 때 쓰는 단어.
2. 프로그래밍 용어 [편집]
2.1. 개요 [편집]
프로그래밍 언어에서 명령을 실행할 시, 입력 값과 계산 대상의 자료형을 함수에서 지원하지 않거나, 함수에서 대상을 계산할 수 없을 때 나오는 오류. 프로그래밍 시 이를 미리 예측하고 그에 대한 대처법을 만들어 두어야 한다.. 대부분의 언어는 직접 예외를 발생시킬 수도 있다.
2.1.1. 예제 [편집]
2.1.1.1. C++ [편집]
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 형식으로 반환한다.
2.1.1.2. C# [편집]
try
{
// 예외 던지기
throw new Exception();
}
catch (Exception e)
{
// 수행할 작업
}
finally
{
// 반드시 수행할 작업
}C#에서는 Exception 클래스를 상속하는 객체만 예외로 던지고 받을 수 있게 강제되어 있다. 만약 그 외의 변수나 객체를 던지려고 하면 컴파일러에서 거부한다. 그리고 Java와 같이 finally문이 추가되었는데 필수는 아니지만 예외를 받았건 받지 않았건 메모리 해제처럼 반드시 실행시켜야만 하는 명령이 있을 경우 사용한다.
2.1.1.3. Java [편집]
try {
// 예외 던지기
throw new Exception();
}
catch (Exception e) {
// 수행할 작업
}
finally {
// 반드시 수행할 작업
}C#과 다른 점이 없다고 생각할 수도 있는데 사실이다. C#이 Java문법을 참고했기 때문이다. Java에서는 아에 예외 검사를 컴파일러에 넣어버려서 예외를 받아내지 않으면 컴파일이 거부된다. 다만 이것이 워낙 귀찮다보니 catch (Exception e) {throw e;} 처럼 받은 예외를 되던져서 떠넘겨 버리는 사람도 있다. 다만 이런 방법은 권장되는 방법은 아니다.
사소한 문제 때문에 예외를 던졌는데 강제로 예외 처리를 하게 하는 것을 방지하려면 RuntimeException클래스를 상속하는 객체를 던지면 된다.
2.1.1.4. Python [편집]
try:
# 예외 던지기
raise BaseException
except BaseException as e:
# 수행할 작업
finally:
# 반드시 수행할 작업라이선스를 별도로 명시하지 않은 문서는 CC BY-NC-SA 2.0 KR에 따라 이용할 수 있습니다.
기여하신 문서의 저작권은 각 기여자에게 있으며, 각 기여자는 기여하신 부분의 저작권을 갖습니다.
문서의 기여자는 역사 탭에서 확인할 수 있습니다.
접두어의 N: - 나무위키 사용자, R: - 리그베다 위키의 사용자를 뜻합니다.
자세한 사항은 나무위키에서 동일한 문서의 역사를 참고하시기 바랍니다.