3. ์์ธ์ฒ๋ฆฌ
by JiwonDev1. try, throw, catch
if( ์กฐ๊ฑด ){
throw ๊ฐ์ฒด1 // int ๊ฐ์ ๊ธฐ๋ณธ ์๋ฃํ์ ์ ์ด๋ ์๊ด์๋ค.
// ๋ฌผ๋ก CPP์์ Exception ํค๋ํ์ผ์ ์์ธ์ ์ฉ ํด๋์ค๋ฅผ ์ ๊ณตํด์ค๋ค.
}
try{
//์์ธ๊ฐ ๋ฐ์์ด ์์๋๋ ๊ณณ
} catch ( ๊ฐ์ฒด1 e){
//์์ธ ์ฒ๋ฆฌ
} catch ( int x ) {
// intํ ๊ฐ์ ๊ธฐ๋ณธ์๋ฃํ๋ ์์ธ๋ก ์ ๋ฌํ ์ ์๋ค.
} catch (...){
// ํด๋น ํค์๋(...)๋ฅผ ์ฌ์ฉํ๋ฉด default catch๋ฌธ์ ์์ฑ ํ ์ ์๋ค.
}
์ฐธ๊ณ ๋ก ์๋์ ๊ฐ์ด catch์ ๋ค์ด๊ฐ๋ ํด๋์ค๊ฐ ์์ ๊ด๊ณ์ธ ๊ฒฝ์ฐ ์์ธ๋ฅผ ์ ๋ ์์์ ์ ๊ฒฝ ์จ์ค์ผ ํ๋ค.
//Parent ํด๋์ค๊ฐ ์๊ณ
//Class Child : public Parent ์ธ๊ฒฝ์ฐ
try{
//์์ธ๊ฐ ๋ฐ์์ด ์์๋๋ ๊ณณ
} catch (Child c){
// ์ด๋ ๊ฒ ์์ ํด๋์ค๋ฅผ ๋จผ์ catch ํด์ค์ผํ๋ค.
// ์๋๋ผ๋ฉด chilid์ parent ๋ ๋ค Parent๋ก ์ธ์ํด์ ์์ธ์ฒ๋ฆฌ๊ฐ ๋๋ค.
// parent p = chlid(); ๊ฐ ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ.
} catch (Parent c) {
}
์ค์ ํด๋์ค์ ์ ์ฉํ๋ฉด ๋ค์๊ณผ ๋น์ทํ๊ฒ ์์ฑ๋๋ค.
template <typename T>
class Vector {
public:
Vector(size_t size) : size_(size) {
data_ = new T[size_];
for (int i = 0; i < size_; i++) {
data_[i] = 3;
}
}
const T& at(size_t index) const {
if (index >= size_) {
throw out_of_range("vector ์ index ๊ฐ ๋ฒ์๋ฅผ ์ด๊ณผํ์์ต๋๋ค.");
}
return data_[index];
}
~Vector() { delete[] data_; }
private:
T* data_;
size_t size_;
};
2. finally๋ ์ด๋ ๊ฐ๋์?
์, ์ฐธ๊ณ ๋ก CPP์๋ finally๋ ์๋ค. ์๋ ์์๊ณ ์์ธ๊ฐ ๋ฐ์ํ์ ๋ ์์คํ ์์๊ด๋ฆฌ ๋ฌธ์ ๊ฐ ์์ด ๊ตณ์ด ์ถ๊ฐํ์ง ์๋๋ค.
์ด๋ฅผ RAII (Resource Acquisition Is Initialization)๋ผ๊ณ ํํํ๋๋ฐ, ์ฝ๊ฒ ๋งํ๋ฉด ์ด๊ธฐํ ์์ ์์ ์์์ ํ๋ํ๊ณ ๊ฐ์ฒด๊ฐ ์ฐ์ด๋ ์ค์ฝํ๋ฅผ ๋ฒ์ด๋๋ฉด ์์์ ํด์ ํ์! ๋ผ๋ ์๋ฏธ.
์์๋ฅผ ๋ค์๋ฉด, ์๋์ ๊ฐ์ ์ฝ๋๋ CPP์ฒ๋ผ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ง์ ๋ฐํํด์ค์ผํ๋ ์ธ์ด์์๋ ์น๋ช ์ ์ด๋ค.
void unsafeFunction() {
Resource* resource = new Resource();
/* Do something with resource */
thisFunctionCanThrowException();
/* Do something else with resource */
delete resource; // throw๋๋ฌธ์ delete๊ฐ ์๋ํ์ง ์์ ์๋ ์๋ค.
}
์ด๋ฅผ catch๋ฌธ์ผ๋ก ์๋์ ๋น์ทํ๊ฒ ํด๊ฒฐ ํ ์์์ง๋ง, ์ฝ๋๋ฅผ ๊ตฌํํ๊ธฐ ๋ณต์กํด์ง๊ณ ์ ์ง๋ณด์๊ฐ ์ด๋ ค์์ง๋ค.
void unmaintanableFunction() {
Resource* resource = nullptr;
try {
resource = new Resource();
/* Do something with resource */
thisFunctionCanThrowException();
/* Do something else with resource */
delete resource;
catch(std::exception& e) {
delete resource;
throw e;
}
}
2-1 ์ค๋งํธํฌ์ธํฐ(unique_ptr<>)
๊ทธ๋์ Cpp 11์ดํ ํ์ค์์๋ ์์๊ฐ์ฒด๋ฅผ ์ค๋งํธ ํฌ์ธํฐ( unique_ptr<class> )๋ก ์ฌ์ฉ ํ๊ธฐ๋ฅผ ๊ถ์ฅํ๊ณ ์๋ค.
์ค๋งํธ ํฌ์ธํฐ๋ ๊ฐ๋ฅดํค๋ ๊ฐ์ฒด๊ฐ ์๋ฉธ ํ ๋ ์์ ์ด ์ฌ์ฉํ๋ ์์(๋ฉ๋ชจ๋ฆฌ)๋ฅผ ์์์ ๋ฐํํด์ค๋ค.
void safeFunction() {
std::unique_ptr<Resource> resource(new Resource());
/* Do something with resource */
thisFunctionCanThrowException();
/* Do something else with resource */
}
์ด๊ฒ๋ณด๋ค ๋ณต์กํ ๋ฌธ์ ๋ ์ด์ฐจํผ Boost ๋ ScopeExit๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ฉด ๋๊ธฐ์ ํฐ ๋ถํธํจ์ ์๋ค๊ณ ํ๋ค.
'๐ฑBackend > CPP' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
4. STL (0) | 2020.12.29 |
---|---|
3. Class (0) | 2020.12.28 |
2. Cpp์ ๋ ํนํ ์ฌ์ฉ๋ฒ (0) | 2020.12.26 |
1. Hello World (0) | 2020.12.26 |
๋ธ๋ก๊ทธ์ ์ ๋ณด
JiwonDev
JiwonDev