본문 바로가기
<알고리즘 문제풀이&연습>/[C,C++] Hackerrank

[C++ 예외처리] Exceptional Server (bad_alloc, exception)

by 사용자 BlockDMask 2017. 7. 17.
반응형

0) 제목

  • Hackerrank 의 C++>Classes부분의 Exceptional Server 문제입니다.

  • C++ 이용하여 풀었습니다.

1) 문제설명

  • 함수가 제대로 작동하는지 관련해서 예외처리 하는 문제입니다.

  • 함수가 제대로 작동하는 경우 -> 함수결과 값 출력.

  • 함수에서 메모리 할당관련 오류가 난경우 -> "Not enough memory" 출력.

  • C++ standard 오류가 발생했을 경우 -> "Exception : S" 출력 S는 에러 메시지.

  • C++ standard가 아닌 다른 오류가 발생했을 경우 -> "Other Exception" 출력.

2) 풀이과정

  • 예외처리라고 하자마자 try, throw, catch가 생각났습니다.

  • 예외가 발생했을때 throw를 통해서 보내는데

  • 이때 catch에서 인자로 받을 오류들의 자료형에 대한 지식이 없어서, 구글검색해서 찾았습니다.

3) 함수설명

  • bad_alloc
     <new>헤더에 클래스로 정의되어있습니다. (iostream에 있습니다.)
    std::bad_alloc은 bac_alloc 생성자와, operator=, what() 으로 구성되어있습니다.
    new를 통해서 동적할당을 할때, 동적할당이 실패하게 되면 std::bad_alloc 객체를 throw를 통해 예외처리로 보냅니다.
    보내는 타입이 std::bad_alloc 임시 객체 이므로, std::bad_alloc 타입으로 받습니다.
     (아래 코드에서는 using 사용하여서 std::는 생략)

  • standard exception
    C++ standard library에서 제공해주는 기본 예외 처리 클래스. -> exception
    예외가 발생하면 그 해당하는 예외의 객체를 throw 합니다. 종류로는 (bad_alloc, bad_cast, bad_exception, bad_typeid, bad_function_call, bad_weak_ptr, logic_error, runtime_error이 있습니다.

  • 모두 exception 객체 타입으로 보내지고, 보내진 exception 객체가 어떤건지 알고싶으면 what() 함수를 사용하면됩니다.
    (bad_alloc도 exception 클래스에서 객체 호출이 가능하므로,  catch 를 exception 보다 위쪽에서 잡아줍니다)

  • standard exception에 속하지 않은 나머지 exception
    catch(...)을 사용해서 예외처리 해줍니다.


4) 코드


//헤더, using namespace std 및 나머지 코드는 hackerrank 문제에 주어져있습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
try{
    cout << Server::compute(A, B) << endl;
 
}catch(bad_alloc& bad){
    cout << "Not enough memory" << endl;
 
}catch(exception& exp){
    cout << "Exception: " << exp.what() << endl;
 
}catch(...){
    cout << "Other Exception" << endl;
}
 
cs

5) 인증


경로 : Dashboard>C++>Classes>Exceptional Server

출처 : [HackerRank] https://www.hackerrank.com/challenges/exceptional-server

<참고>

http://en.cppreference.com/w/cpp/memory/new/bad_alloc

http://www.cplusplus.com/doc/tutorial/exceptions/


C하다가 C++ 하니까 헷갈리네요..

C++ 은 C 보다 더 많이 부족합니다.

더 나은 코드로 보완 할 곳이 있으면 말씀해주세요.

부족한 코드 많은 지적 부탁드립니다.

반응형

댓글0