์์ธ ์ฒ๋ฆฌ
์์ธ ์ฒ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ฏ๋ก์จ ์๊ณ ๋ฆฌ์ฆ์ด ๋ง์ฃผํ ์ ์๋ ์์ธ ์ํฉ์ ๋ํด ์ฝ๋๋ฅผ ๋ถ๋ฆฌํ ์ ์๋ค. ์ด ๊ฒฐ๊ณผ ์๊ณ ๋ฆฌ์ฆ์ ๋ณด๋ค ์ง์คํ ์ ์๋ค.
์๋ฌ๋ฅผ ๋ง๋ค์ด ๋ณด์.
int main(){
vector<int> v{1, 2, 3, 4}
int num;
cin >> num;
cout << v.at(num) << endl;
return 0;
}Output
10
=> Error
vector size๋ณด๋ค ํฐ index๋ฅผ ๋ฃ์ ๊ฒฝ์ฐ ํ๋ก๊ทธ๋จ์ด ๋ฉ์ถฐ๋ฒ๋ฆฐ๋ค.
์ด๋ ๊ฒ ๋ ๊ฒฝ์ฐ ๋ง๋๋ ์ฌ๋ ์ ์ฅ์์๋ ์ด๋ ๋ถ๋ถ ๋๋ฌธ์ ์๋ฌ๊ฐ ๋ฌ๋์ง ์ฐพ๊ธฐ ์ด๋ ต๋ค.
Try/catch
๊ทธ๋์ ์ฐ๋ฆฌ๋ ์์ธ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ค์๊ณผ ๊ฐ์ ๊ตฌ๋ฌธ์ ํ์ฉํ๋ค.
int main(){
vector<int> v{1, 2, 3, 4};
int num;
cin >> num;
try{
cout << v.at(num) << endl;
}
catch(exception& e){
cout << e.what() << endl;
cout << "์ธ๋ฑ์ค ์ค๋ฅ๊ฐ ๋ฐ์!" << endl;
}
cout << "[program is still running!]" << endl;
return 0;
}
Output1
์๊ณ ์ถ์ ์ธ๋ฑ์ค๋ฅผ ์
๋ ฅํด์ฃผ์ธ์ :3
4
[program is still running!]
Program ended with exit code: 0
Output2
์๊ณ ์ถ์ ์ธ๋ฑ์ค๋ฅผ ์
๋ ฅํด์ฃผ์ธ์ :10
vector
์ธ๋ฑ์ค ์ค๋ฅ๊ฐ ๋ฐ์!
[program is still running!]
Program ended with exit code: 0
์ธ๋ฑ์ค๋ฅผ ๋์ด๊ฐ๋ ๊ฐ์ ์ ๋ ฅํ์ ๋, ์ด ์ค๋ฅ๋ฅผย ์บ์นํด์ ์์ธ๋ฅผ ์ฒ๋ฆฌํด ์ฃผ์๋ค. ๋ํ, ์์ธ์ฒ๋ฆฌ ๊ตฌ๋ฌธ์ ํตํด์, ํ๋ก๊ทธ๋จ์ด ์ ๋๋ก ๋ง๋ฌด๋ฆฌ ๋์๋ค๋ ์ฌ์ค์ ์ ์ ์๋ค! ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์์ธ๋ฅผ ํต๊ณผํ๊ธฐ ๋๋ฌธ์ ๋ฌธ์ ๊ฐ ์์์ ํ๋จํ ์ ์๋ค.
์ฌ์ฉ๋ฒ
- ์์ธ๋ฅผ throw ํ ๊ฒ ๊ฐ์ ๊ณณ์ย
tryย block์ผ๋ก ์ผ๋ค. - ์์ธ๊ฐ ๋ฐ์ ํ์ ๊ฒฝ์ฐ์๋ง ๋ฐ์ํ ์ฝ๋๋ฅผย
catchย block ์ผ๋ก ์ผ๋ค. exception& eย ๋ ํ๋ก๊ทธ๋จ์ด ๋์ง๋ ์๋ฌ๋ฅผ ๋ฐ์์ฃผ๋ ๊ฐ์ฒด์ด๋ค.try/catchย ๊ตฌ๋ฌธ์ยifย ๋ฌธ ์ฒ๋ผ state๊ฐ ํ์ค์ด๋๋ผ๋ ๊ผญย{}ย ๋ก ๊ฐ์ธ์ค์ผ ํ๋ค.
std::exception class
์์ธ๋ฅผ ๋ด๋นํ๋ ๊ธฐ๋ณธ c++์ ๊ณต ํด๋์ค์ด๋ค. ๋ชจ๋ ์์ธ ์ฒ๋ฆฌ ํด๋์ค๋ ์ด ํด๋์ค๋ฅผ ์์๋ฐ์์ ์์ฑ๋๋ค.
๋ฐ๋ผ์ ๋คํ์ฑ์ ์๋ฆฌ์ ์ํด ์ด๋ค ์๋ฌ๋ฅผ ๋์ง๋๋ผ๋, ์ถ์ํด๋์ค์ธย exception classย ๋ก ๋ฐ์ ์ ์๋ค.
Member functions

์ด์ค์์ย what()ย ์ด๋ผ๋ ํจ์๊ฐ ์ค์ํ๊ฒ ์ฌ์ฉ๋๋๋ฐ, ์ด๋ค ์์ธ์ด๋์ ๋ฐ๋ผ ์ดย what()ย ํจ์๊ฐ ๋ค๋ฅด๊ฒ ๊ตฌ์ฑ๋๋ค. ์ฆ, override ๋ฅผ ํตํด ์ฌ์ ์ํด์ ์ฌ์ฉํ๋ค!
์ฌ๊ธฐ์๋ ์ฌ์ค ๋ค๋ฅธ๊ตฌ๋ฌธ์ ์ฐ์ง๋ง ๊ทธ๊ฑด ๋ฐ์์ ์์๋ณด์.
vector container ํจ์๋ฅผ ์ฌ์ฉํ๋ ์ด์
์์ ์์์, vector์ index๋ก ์ ๊ทผํ๋ ๋ถ๋ถ์ ๋ฐ๊ฟ๋ณด์.
int main(){
vector<int> v{1, 2, 3, 4};
int num;
cin >> num;
try{
// ์ด ๋ถ๋ถ!
cout << v[num] << endl;
}
catch(exception& e){
cout << e.what() << endl;
cout << "์ธ๋ฑ์ค ์ค๋ฅ๊ฐ ๋ฐ์!" << endl;
}
cout << "[program is still running!]" << endl;
return 0;
}
Output
์๊ณ ์ถ์ ์ธ๋ฑ์ค๋ฅผ ์
๋ ฅํด์ฃผ์ธ์ :3
4
[program is still running!]
Program ended with exit code: 0
์๊ณ ์ถ์ ์ธ๋ฑ์ค๋ฅผ ์
๋ ฅํด์ฃผ์ธ์ :10
1
[program is still running!]
Program ended with exit code: 0
๊ธฐ์กด ์๋ 10์ ๋ฃ์์ ๊ฒฝ์ฐ ์๋ฌ๋ฅผ ์ถ๋ ฅํ๋๋ฐ, ์ด๋ฒ์๋ ์๋ฌ๊ฐ ๋จ์ง ์๋๋ค ์ ๊ทธ๋ด๊น?
์ด๊ฑด ํด๋์ค ๋ด๋ถ์์ ์๋ฌ๋ฅผ ๋ฐ์ํ๋ย exceptionย ๊ฐ์ฒด๋ฅผย throwย ํด์ฃผ์ง ์์์ ๊ทธ๋ ๋ค.
ํด๋์ค์์ ์์ธ ์ฒ๋ฆฌ ๊ตฌ๋ฌธ ๋ง๋ค๊ธฐ
์์ธ ์ฒ๋ฆฌ๊ฐ ํ์ํ ํจ์ ๋ง๋ค๊ธฐ
์์์๋ย try/catchย ๊ตฌ๋ฌธ์ ์ฌ์ฉํด vector container ์์ ๋ฐ์ํ๋ ์์ธ์ฒ๋ฆฌ๋ฅผ ์ด๋ป๊ฒ ๋ฐ์์ ํํํ๋์ง ์์๋ณด์๋ค.
๊ทธ๋ ๋ค๋ฉด ๋ด๊ฐ ํจ์๋ ํด๋์ค๋ฅผ ๋ง๋ค ๋, ์ด๋ค ๋ถ๋ถ์์ ์๋ฌ๊ฐ ๋ ์ง๋ฅผ ๊ท๋ช ํด์ฃผ๋ ๊ฒ์ด ํ์ํ๋ค.
์ฌ๊ธฐ์๋, file์ ์ฝ์ด, ๋ฒกํฐ๋ก ๋ฃ์ด์ฃผ๋ ํจ์๋ฅผ ๋ง๋ค์ด ๋ณด์๋ค. ์ด๋ ๋ง์ฝ ํ์ผ์ ์ฝ์ง ๋ชปํ ๊ฒฝ์ฐ ์๋ฌ๋ฅผ throw ํ๋๋ก ๋ง๋ค์๋ค.
throw ๊ตฌ๋ฌธ
vector<int> load_vector(string filename){
ifstream fin(filename);
if(!fin){
// ์์ธ ์ฒ๋ฆฌ throw
throw FileNotFoundException(filename);
}
int num, value;
vector<int> result;
fin >> num;
for(int i = 0; i < num; i++){
fin >> value;
result.push_back(value);
}
return result;
}๊ตฌ๋ฌธํด์
- ์์ธ ์ฒ๋ฆฌ throw
- ํน์ ์ํฉ์ ์๋ฌ๊ฐ ๋ ๊ฒฝ์ฐ ์ฐ๋ฆฌ๋ ์๋ฌ๋ฅผ ๋์ ธ์ค์ผ ํ๋ค.
- ์ด๋ ์ฌ์ฉํ๋ ๊ฒ์ดย throwย ๊ตฌ๋ฌธ์ด๋ค.
์์ธ ์ฒ๋ฆฌ ํด๋์ค ๋ง๋ค๊ธฐ
๊ทธ๋ ๋ค๋ฉดย FileNotFoundExceptionย ์ ์์ธ์ฒ๋ฆฌ๋ฅผ ๋ด๋นํ๋ ํด๋์ค์ด๋ฏ๋ก,
์์์ ๋งํ๋ฏ, ์์ธ ์ฒ๋ฆฌ ํด๋์ค๋ย std::exceptionย ํด๋์ค๋ฅผ ์์ํด์ ๋ง๋ ๋ค.
class FileNotFoundException : public exception {
string message;
public:
// 1.
FileNotFoundException(string _m): message("File not Found : " + _m){}
// 2.
virtual const char* what() const throw() {
// 3.
return message.c_str();
}
};
๊ตฌ๋ฌธ ํด์
- ์์ฑ์(constructor)
- member variable ๋ก ๊ฐ๊ณ ์๋, message์ ๋ด์์ค๋ค.
what()ย override ํ๊ธฐ.- virtual
- ์ดย
FileNotFoundExceptionย ํด๋์ค๋ฅผ ์์๋ฐ๋ ๋ค๋ฅธ ํด๋์ค๊ฐ ์์ ์ ์๊ธฐ ๋๋ฌธ์ ์จ์ฃผ์๋ค.
- ์ดย
- const
what()ย ํจ์์ return type์ยconst char*ย ์ด๋ค.- ์ฆ, ๋ฌธ์์ด์ ๋ฆฌํด ๊ฐ์ผ๋ก ๊ฐ๋๋ค๋ ๊ฒ์ธ๋ฐ,
- ์ด ๋ฆฌํด ๊ฐ์ ๋ณํ ์ ์์ผ๋ฏ๋กย
constย ๋ฅผ ์ ์ด ๋ช ์์ ์ผ๋ก ์จ์ค๋ค.
- what()
- override๋ฅผ ์ํํ ํจ์์ ์ด๋ฆ์ด๋ค.
- const
- ์ธ๋ถ ํจ์์์ ๋ง๋ ๊ฐ์ฒด๋ฅผ ๋ถ๋ฌ์ฌ ๋,ย
callbyreferenceย ๋ก ๊ฐ์ ธ์ฌ ๊ฒฝ์ฐ ๊ฐ์ ๋ณํ ์ํฌ ์ ์๋ค. - ๊ทธ๋์ ์ฐ๋ฆฌ๋
void print(const ํด๋์ค์ด๋ฆ& p)์ด๋ฐ์์ผ๋ก ๊ฐ์ ธ์ค๋๋ฐ, ์ด๋ ์ ๋ ฅ ํ๋ผ๋ฏธํฐ์ ๊ฐ์ ๋ณํ์ํค์ง ์์ผ๋ฉด์ reference ํ๊ฒ ๋ค๋ ์๋์์ const๋ฅผ ์ ๊ฒ๋๋ฉด, ๋ด๊ฐ ๋ง๋ class ์์๋ const๋ฅผ ์ ์ ํจ์๋ง ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค. - ์ฆ, ์ธ๋ถ์์ const ์ํ๋ก ์ฌ์ฉํ๋ ํจ์๋ฅผ ์๋ฏธํ๋ค.
- ์ธ๋ถ ํจ์์์ ๋ง๋ ๊ฐ์ฒด๋ฅผ ๋ถ๋ฌ์ฌ ๋,ย
- throw()
- ์์์ ์ค๋ช
ํ ์ด ๋ถ๋ถ์ด ๋ค๋ฅธ๋ฐ, exception ํด๋์ค๋ฅผ ์์๋ฐ์ ๋,ย
what()ย ํจ์๋ฅผยoverrideย ํ ๋๋,throw()ย ๋ฅผ ์ฌ์ฉํ๋ค.
- ์์์ ์ค๋ช
ํ ์ด ๋ถ๋ถ์ด ๋ค๋ฅธ๋ฐ, exception ํด๋์ค๋ฅผ ์์๋ฐ์ ๋,ย
- virtual
- string ์ธย
messageย ๋ฅผยcharย ๋ก ๋ง๋ค์ด์ฃผ์.
main ์์ try/catch ๊ตฌ๋ฌธ
์ด์ ํจ์๋ ๋ง๋ค๊ณ , ์์ธ์ฒ๋ฆฌ ํด๋์ค๋ ์ ์ํ์ผ๋, try/catchย ๊ตฌ๋ฌธ์ ์ฌ์ฉํด์ ๋ํ๋ด๋ณด์.
int main(){
try{
vector<int> v = load_vector("values.dat");
}
// 1. catch(FileNotFoundException& e)
catch(exception& e){
// 2.
cout << e.what() << endl;
}
return 0;
}๊ตฌ๋ฌธํด์
- ์ฃผ์์ฒ๋ฆฌํ ๋ถ๋ถ์ ๋ณด๋ฉด, ์๋ย
catchย ๊ตฌ๋ฌธ์์๋ ์์ธ ์ฒ๋ฆฌ ๊ฐ์ฒด๋ฅผ ๋ฐ์์ค์ผ ํ๋ค.- ์ฆ,ย
catch(FileNotFoundException& e)ย ์ด๋ฐ์์ผ๋ก ์จ์ค์ผ ํ๋๋ฐ,catch(exception& e)ย ์ด๋ ๊ฒ๋ง ์จ์คฌ๋ค. - ์ด ์ด์ ๋ ์์์ ์ค๋ช ํ ๊ฒ๊ณผ ๊ฐ์ดย ๋คํ์ฑย ๋๋ฌธ์ด๋ค.
- ์ฆ,ย
- ์๋ฌ๊ฐ ๋ฐ์ํ์ ๋, ์ด ์๋ฌ๊ฐ ์ด๋ค ์๋ฌ์ธ์งย
what()ย ๋ฉ์๋๋ก ๋ณด์ฌ์ค๋ค.
์ ์ฒด ์ฝ๋
#include <iostream>
#include <vector>
#include <string>
#include <fstream>
using namespace std;
class FileNotFoundException : public exception {
string message;
public:
FileNotFoundException(string _m): message("File not Found : " + _m){}
const char * what() const throw() {
return message.c_str();
}
};
vector<int> load_vector(string filename){
ifstream fin(filename);
if(!fin){
throw FileNotFoundException(filename);
}
int num, value;
vector<int> result;
fin >> num;
for(int i = 0; i < num; i++){
fin >> value;
result.push_back(value);
}
return result;
}
int main(){
try{
vector<int> v = load_vector("values.dat");
}
catch(exception& e){
cout << e.what() << endl;
}
return 0;
}
try/catch ๊ตฌ๋ฌธ์ ์๋ ๋ฐฉ์
Findint Nearestย catchย Statement

์ฌ๋ฌ๊ฐ์ ํจ์์ย exceptionย ๊ณผย try/catchย ๊ตฌ๋ฌธ์ ๊ฑธ์ด๋์ ๊ฒฝ์ฐ, ๊ฐ์ฅ ๊ทผ์ ํย catchย ๊ตฌ๋ฌธ์ ์ฐพ์๊ฐ์ ์คํํ๋ค.
์์
#include <iostream>
#include <vector>
#include <string>
#include <fstream>
using namespace std;
// double throw
void filter(vector<int>& v, int i){
v.at(i)++;
}
void compute(vector<int>& a){
for(int i = 0; i < 6; i++){
try{
filter(a, i);
}
catch(exception& ex){
cout << "******1๋ฒ catch********" << endl;
cout << "๋ฐ๋ณต๋ฌธ์ด ์ค๊ฐ์ ๋ฉ์ท์ต๋๋ค." << endl;
cout << "when i =" << i << endl;
cout << "**********************" << endl;
// throw ex;
}
}
}
int main(){
vector<int> list {10,20,30,40,50};
try{
compute(list);
}
catch(exception& e){
cout << "******2๋ฒ catch******" << endl;
cout << "์๋ฌ๊ฐ ๋ฐ์ํ์ต๋๋ค." << endl;
cout << e.what() << endl;
cout << "**********************" << endl;
}
cout << "ํ๋ก๊ทธ๋จ ์ข
๋ฃ" << endl;
}
Output
******1๋ฒ catch********
๋ฐ๋ณต๋ฌธ์ด ์ค๊ฐ์ ๋ฉ์ท์ต๋๋ค.
when i =5
**********************
ํ๋ก๊ทธ๋จ ์ข
๋ฃ
Program ended with exit code: 0
๊ตฌ๋ฌธ ํด์
- main ํจ์
- main ํจ์๋ฅผ ๋ณด๊ฒ ๋๋ฉด, compute ํจ์๋ฅผ ํธ์ถํ๊ฒ ๋๋ค.
- compute ํจ์
- compute ํจ์๋ filter ํจ์๋ฅผ ํธ์ถํ๋ค.
- filter ํจ์
- filter ํจ์๋ฅผ ์ํํ๋ ๋์ค, i์ ๊ฐ์ด size๋ฅผ ๋๋ ์๊ฐ์ด ์ค๊ณ , exception ๊ฐ์ฒด๋ฅผ throw ํ๋ค.
- ํ๋ก๊ทธ๋จ์ ์๋ ๊ธธ์ ๋๋์๊ฐ๋ฉฐ ๊ฐ์ฅ ๊ทผ์ ํ catch ๋ฌธ์ ์ฐพ๋๋ค.
- ์ด ๊ฒฝ์ฐ compute ํจ์์ ์๊ธฐ ๋๋ฌธ์, ์ด catch ๋ฌธ์ ์คํํ๋ค.
- main ํจ์๋ก ๋์์ฌ ๋๋ throw๊ฐ ๋ค ํด์๋๊ณ , ๋์์ค๋ throw๊ฐ ์์ผ๋ฏ๋ก catch ํจ์๋ ์คํ๋์ง ์๋๋ค.
double throw(Re-thorwing)
๊ทธ๋ฌ๋ฉด, main์ผ๋ก ๋์์ฌ ๋๋, ๊ฐ์ฒด๋ฅผ ๋์ ธ์ฃผ๋ฉด, ์ฌ๋ฌ๋ฒ์ catch ๊ตฌ๋ฌธ์ ์คํ ์ํฌ ์ ์์ง ์์๊น?
์์
#include <iostream>
#include <vector>
#include <string>
#include <fstream>
using namespace std;
// double throw
void filter(vector<int>& v, int i){
v.at(i)++;
}
void compute(vector<int>& a){
for(int i = 0; i < 6; i++){
try{
filter(a, i);
}
catch(exception& ex){
cout << "******1๋ฒ catch********" << endl;
cout << "๋ฐ๋ณต๋ฌธ์ด ์ค๊ฐ์ ๋ฉ์ท์ต๋๋ค." << endl;
cout << "when i =" << i << endl;
cout << "**********************" << endl;
throw ex;
}
}
}
int main(){
vector<int> list {10,20,30,40,50};
try{
compute(list);
}
catch(exception& e){
cout << "******2๋ฒ catch******" << endl;
cout << "์๋ฌ๊ฐ ๋ฐ์ํ์ต๋๋ค." << endl;
cout << e.what() << endl;
cout << "**********************" << endl;
}
cout << "ํ๋ก๊ทธ๋จ ์ข
๋ฃ" << endl;
}
Output
******1๋ฒ catch********
๋ฐ๋ณต๋ฌธ์ด ์ค๊ฐ์ ๋ฉ์ท์ต๋๋ค.
when i =5
**********************
******2๋ฒ catch******
์๋ฌ๊ฐ ๋ฐ์ํ์ต๋๋ค.
std::exception
**********************
ํ๋ก๊ทธ๋จ ์ข
๋ฃ
Program ended with exit code: 0