Try … catch
try {} 구문 안의 내용중 예외(Exception)이 발생한다면, catch구문안의 내용을 실행하는 문법이다.
이 예외라는것은 런타임 에러와 아주 조금이나마 유사하다고 볼수있을것이다.
컴파일 중엔 에러가 발생하지 않는 에러에 대해서 대처할 수 잇기 때문이다.
Syntax
try{
Some Code ...
} catch (exception_type val) {
Exception controlling ...
}
위와 같은 구문이며 if else if 처럼 catch를 중첩해서 쓸 수 도있다.
Throw
예외를 발생 시키는 키워드 이다.
만약 try 구문 안에서 throw가 이루어진다면 catch로 throw된 에러가 전달 된다.
try{
...
throw expction;
...
} catch (type expc){
...
}
위처럼 원하는 예외를 발생 시켜 catch구분으로 넘어가게 한다.
만약 다른 try 구문안에 존재하는 함수 내부에서 throw가 발생했을때 만약 그안에 catch구문이 없다면, catch를 만날때 가지 함수 밖(?)으로 나가게된다.
그 과정에서 쌓여있던 (stack)이 풀리게(free)된다. 이를 스택 풀기(Stack unwinding)이라고 하는 것 같다.
++ 예외(throw)의 경우 함수 밖으로 나가게 될때 해당 함수의 반환(return)타입에 국한되지 않고 함수를 빠져나가게되며, 에러를 전달한다.
물론 이를 제한하기 위한 방법이 아래와 같은 방법으로 존재한다.
int func(int num) throw(int){...}
위와 같이 함수를 선언하게 되면 (int)형으로만 예외 발생을 제한하며,
만약 throw ( )
와같이 안에 아무것도 들어있지 않다면, 어떠한 예외도 전달하지 않는 단 뜻이다.
이때 호출되는 함수는 unexpected()이다. 이 함수가 호출되면 프로그램을 종료하는 함수를 호출해 프로그램을 강제 종료 시킨다.
예외 클래스
예외를 발생 시킬 때 type에 따라 받을 수 있다고 했는데, class를 통해서도 받을 수 있다.
이를 예외 클래스라고 하는데, 일반 클래스와 다른게 거의 없고 throw를 통해 throw CLASS var(param)
이렇게 하게되면 해당 클래스로된 예외가 전달 되게 되며,
해당 클래스를 catch하는 구문이 나올때 까지 전달하게 된다.
다만, 클래서에서 상속에 대해선 조심해야되는데, 만약 예외 클래스A를 상속한 예외 클래스 B, C 가있다면,
이를 catch할 때 A를 먼저 catch하게 되면 B C예외가 발생하더라도 A클래스를 catch하는 catch문에 잡히게 되므로 주의를 요한다.
모든 예외를 처리하는 catch 블록
어떠한 예외가 발생하더라도 모든 자료형에 대해서 catch하는 try-catch구문이 있다.
try { } catch (...) { }
이 구문에서 ( … )는 모든 예외를 받겠단 뜻이다.
C++에서의 형변환
C에선 형변환을 위해선 (int)var 같은 형식으로 작성하였는데, C++에선 오래된 형변환으로 지원만할 뿐 C++에서 사용되는 형 변환방법이 따로 존재한다.
- static_cast
: A 타입에서 B타입으로 - const_cast
: const 성향을 삭제 - dynamic_cast
: 상속 관계에서의 안전한 형변환 - reinterpret_cast
: 상관없는 자료형으로 변환
이들을 사용하기 위해선 ~~_cast<바꿀 type>var
이렇게 사용하면 된다.
C++ 문법정리 끝.