JiwonDev

3. ์˜ˆ์™ธ์ฒ˜๋ฆฌ

by JiwonDev

1. 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

ํ™œ๋™ํ•˜๊ธฐ