C++의 예외 처리
catch가 여러 개면, 던진 예외는 어디로 들어갈까?
화면을 누르면 다음 장으로 넘어갑니다
try와 catch
try에 넣고 catch로 받습니다
C++의 예외 처리는 1990년에 추가됐고, 앞선 언어들(CLU, Ada, ML)의 설계를 바탕으로 했습니다. 예외가 날 수 있는 코드를 try 블록에 넣고, 바로 뒤에 처리기인 catch 절을 하나 이상 적습니다.
예시 코드입니다. 괄호 안은 형식 매개변수(받을 값의 타입과 이름)입니다. int는 정수, double은 소수 타입이고, // 뒤는 설명(주석)입니다.
throw
throw가 값을 던집니다
C++의 예외는 모두 throw 문으로 직접 발생시킵니다. throw 뒤에 적은 식의 값이 던져지고, 그 값의 타입이 어느 처리기로 갈지를 정합니다. 예외에 따로 이름이 없어 타입이 딱지 노릇을 합니다.
예시 코드입니다. 404는 정수라서 타입이 int이고, 2.5는 소수라서 타입이 double입니다.
처리기 고르기
위에서부터 타입을 맞춰 봅니다
던져진 값의 타입을 catch 절의 형식 매개변수 타입과 위에서부터 차례로 맞춰 봅니다. 타입이 맞는 절을 만나면 그 처리기가 실행되고, 던진 값이 매개변수로 들어갑니다.
예시 코드입니다. double은 int와 맞지 않아 첫째 절을 지나칩니다. char는 문자 하나를 담는 타입입니다.
catch의 매개변수
변수 없이 타입만 적어도 됩니다
처리기의 이름은 모두 catch로 같고, 매개변수의 타입만 다릅니다. 그래서 타입으로 고릅니다. 변수 이름까지 적으면 던진 값을 받아 쓰고, 타입만 적으면 처리기를 가리는 데만 씁니다.
catch 같은 이름을 오버로딩된 이름(같은 이름에 뜻이 여럿, 6강)이라고 합니다. 줄임표(...)는 다음 장에서 봅니다.
줄임표
맞는 절이 없으면 지나칩니다
타입이 맞는 catch 절이 하나도 없으면 예외는 그 try 구조를 그대로 지나칩니다. 맨 끝에 catch (...)를 두면 앞에서 못 받은 예외를 모두 받습니다.
예시입니다. 'x'는 문자 x이고 타입은 char입니다. try 구조는 try 블록과 거기 딸린 catch 절들을 합친 것입니다.
다시 던지기
받았다가 다시 던질 수 있습니다
처리기 안에서 식 없이 throw;라고만 적으면, 지금 받은 예외를 그대로 다시 던집니다. 여기서 할 일만 하고 나머지 처리는 다른 곳의 처리기에 맡길 때 씁니다.
예시 코드입니다. log(e)는 기록을 남기는 함수라고 가정했습니다. 식 없는 throw는 처리기 안에서만 쓸 수 있습니다.
다음 편