예외처리
2022. 4. 10. 10:21ㆍC++
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;//알 수 없는 예외 처리
}
}