예외처리

2022. 4. 10. 10:21C++

int fact(int n){
    if(n == 0) return 1;
    return n * fact(n-1);
}

위와 같이 팩토리얼을 반환하는 함수가 있다고 하자.

아래와 같이 사용자에게 n값을 입력받는다고 할때 음수 값을 받지 않도록 예외 처리를 해주어야 한다. 

int main(void)
{
    int n;
    cin>>n;
    if (n < 0){
        cout<<n<<": 음수입니다."<<endl;
    }
    else{
        cout<<n<<"! = "<<fact(n)<<endl;
    }

    return 0;
}

 

try - throw - catch

int main(void)
{
    int n;
    cin>>n;
    try {
        if(n<0){	//n이 0보다 작다면 
            throw n;	//catch문으로 n을 던져버린다. 
        }
        cout<<n<<"! = "<<fact(n)<<endl;
    }
    catch(int e){	//e에 n값이 들어간다. 
        cout<<e<<": 음수입니다."<<endl;
    }
    return 0;
}

아래와 같이 string으로도 던질 수 있다. 

int main(void)
{
    int n;
    cin>>n;
    try {
        if(n<0){
            throw to_string(n) + ": 음수입니다.";	//to_string(): 형변환
        }
        cout<<n<<"! = "<<fact(n)<<endl;
    }
    catch(string e){
        cout<<e<<endl;
    }
    return 0;
}

 

그냥 if문을 사용해도 될 것을 왜 try - catch문을 사용할까?

> 단순한 경우에는 if문이 편할수도 있다. 하지만 아래의 경우처럼 사용가능하다. 

 

int fact(int n){
    if(n<0) throw to_string(n) + ": 음수입니다.";   //fact()를 호출했던 main함수의 catch문으로 간다. 
    if(n == 0) return 1;
    return n * fact(n-1);
}

이렇게 함수 안에 throw를 넣을 수 있다. 

int main(void)
{
    int n,r;
    cin>>n>>r;
    try {
        int a = fact(n);
        int b = fact(r);
        int c = fact(n-r);

        cout<<n<<a / b / c<<fact(n)<<endl;
    }
    catch(string e){
        cout<<e<<endl;
    }
    return 0;
}

또한 throw를 사용하면 아래와 같이 여러 함수간의 이동이 가능하다. 

#include <iostream>
#include <string>

using namespace std;

int fact(int n){
    if(n<0) throw to_string(n) + ": 음수입니다.";   //fact()를 호출했던 main함수의 catch문으로 간다. 
    if(n == 0) return 1;
    return n * fact(n-1);
}

int comb(int n, int r){
    int a = fact(n);
    int b = fact(r);
    int c = fact(n-r);
    return a/b/c;

}

int main(void)
{
    int n,r;
    cin>>n>>r;
    try { 
        cout<<n<<comb(n,r)<<endl;
    }
    catch(string e){
        cout<<e<<endl;
    }
    return 0;
}

 

catch문의 자료형을 여러개 하여 다양한 catch문을 만들수 있다. 

int main(void)
{
    try{
        throw 3;
        throw "hello";
    }
    catch(int a){

    }
    catch(string b){

    }
    catch(...){
        cout<<"알수 없는 에러 발생"<<endl;//알 수 없는 예외 처리
    }
}

 

'C++' 카테고리의 다른 글

연산자 오버로딩  (0) 2022.04.10
멤버 메서드의 선언, 정의 분리  (0) 2022.04.10
범위지정 연산자  (0) 2022.04.09
inline 함수  (0) 2022.04.09
매크로  (0) 2022.04.09