cpp_exception - 8BitsCoding/RobotMentor GitHub Wiki

  • C++도 μ˜ˆμ™Έλ₯Ό μ§€μ›ν•œλ‹€.
  • ν•˜μ§€λ§Œ C++의 μ˜ˆμ™Έμ˜ μ€‘μš”μ„±μ€ 쑰금 λ–¨μ–΄μ§„λ‹€.
  • μ˜¬λ°”λ₯Έ μ‚¬μš©λ²• μ€‘μ‹¬μœΌλ‘œ μ‚΄νŽ΄λ³΄μž.

μ˜ˆμ™Έ λ°œμƒ 사둀

// λ²”μœ„ μ΄νƒˆ
int main()
{
    std::string myCatName = "CoCo";

    try
    {
        char ch = myCatName.at(5);
    }
    catch (const std::out_ofrange& e)
    {
        std::cerr << "out of range: " << e.what() << std::endl;
    }
    catch(const std::exception& e)
    {
        std::cerr << "exception: " << e.what() << std::endl;
    }

    return 0;
}
// λ‹€μŒκ³Ό 같은 λ°©λ²•μœΌλ‘œλ„ 해결이 κ°€λŠ₯ν•˜λ‹€.
std::string myCatName = "CoCo";

const size_t INDEX = 5;
if(INDEX < myCatName.size())
{
    char ch = myCatName.at(INDEX);
}

μ˜ˆμ™ΈλŠ” λ‚΄κ°€ 컨트둀 ν•  수 μ—†λŠ” 상황을 μ˜ˆμ™ΈλΌκ³  ν•˜μ§€ μ•Šλ‚˜? μœ„ 상황은 κ³Όμ—° μ˜ˆμ™Έμ²˜λ¦¬λΌ ν•  수 μžˆλŠ”κ°€?


μ˜ˆμ™Έ λ°œμƒ 사둀2

// 0으둜 λ‚˜λˆ„κΈ°
int number1 = 0;
int number2 = 0;

// μ—¬κΈ°μ„œ 0이 λ“€μ–΄μ˜¨λ‹€λ©΄?
std::cin >> number1 >> number2;

try
{
    int result = number1 / number2;
}
catch(const std::exception& e)
{
    std::cerr << "excetion: " << e.what() << std::endl;
}
// μ—­μ‹œ μ˜ˆμ™Έκ°€ ν•„μš”ν•˜λ‚˜ μ‹Άλ‹€..?
if(number2 != 0)
{
    int restul = number1 / number2;
}

μ˜ˆμ™Έ λ°œμƒ 사둀3

// NULL μ°Έμ‘°
Cat* myCat = nullptr;

try
{
    const char* myCatName = myCat->GetName();
}
catch(const std::exception& e)
{
    std::cerr << "exception: " << e.what() << std::endl;
}
// μ—­μ‹œ μ˜ˆμ™Έκ°€ ν•„μš”ν•˜λ‚˜ μ‹Άλ‹€..?
if(myCat != NULL)

λŒ€λΆ€λΆ„μ˜ μ˜ˆμ™ΈλŠ” λΆˆν•„μš”ν•˜λ‹€.


μ μ ˆν•œ μ˜ˆμ™Έμ²˜λ¦¬

  1. μœ νš¨μ„± 검사/μ˜ˆμ™ΈλŠ” 였직 κ²½κ³„μ—μ„œλ§Œ
    • λ°–μ—μ„œ μ˜€λŠ” 데이터λ₯Ό μ œμ–΄ν•  수 μ—†κΈ° λ•Œλ¬Έ
    • 예) μ™ΈλΆ€μ—μ„œ λ“€μ–΄μ˜€λŠ” μ›Ή μš”μ²­, 파일 읽기/μ“°κΈ°, μ™ΈλΆ€ 라이브러리 λ“±
  2. 일단 μ‹œμŠ€ν…œμ— λ“€μ–΄μ˜¨ λ°μ΄ν„°λŠ” λ‹€ μ˜¬λ°”λ₯΄λ‹€κ³  κ°„μ£Όν•˜μž
    • ASSERTλ₯Ό μ‚¬μš©ν•˜μ—¬ 개발 쀑 문제λ₯Ό μž‘μ•„λ‚΄κ³  κ³ μΉ  것.
  3. μ˜ˆμ™Έ 상황이 λ°œμƒν•  λ•ŒλŠ” NULL을 λŠ₯λ™μ μœΌλ‘œ μ‚¬μš©ν•  것
    • ν•˜μ§€λ§Œ 기본적으둜 ν•¨μˆ˜κ°€ NULL을 λ°˜ν™˜ν•˜κ±°λ‚˜ λ°›λŠ” 일은 없어야함
    • μ½”λ”© ν‘œμ€€μ€ λ§Œμ•½ NULL을 λ°˜ν™˜ν•˜κ±°λ‚˜ λ°›λŠ”λ‹€λ©΄ ν•¨μˆ˜μ˜ 이름을 잘 지을 것.
// Example
string ReadFileOrNull(string filename)
// μœ„μ™€ 같이 νŒŒμΌμ΄λ¦„μ— null을 λŠ₯λ™μ μœΌλ‘œ μ‚¬μš©ν•˜μ—¬ errorκ°€ λ°œμƒμ‹œ null이 리턴됨을 μ•Œλ €μ€˜μ•Όν•¨
{
    // ASSERTλ₯Ό 잘 μ¨μ•Όν•œλ‹€.
    ASSERT(filename != null);

    if(!File.Exists(filename))
        return null;
}
  • μ˜ˆμ™ΈλŠ” λ§Œλ³‘ν†΅μΉ˜μ•½μ΄ μ•„λ‹ˆλ‹€.
  • λ™μΌν•œ ν”„λ‘œκ·Έλž˜λ¨Έκ°€ 둜직과 μ˜ˆμ™Έλ₯Ό λͺ¨λ‘ μž‘μ„± * 둜직이 잘λͺ»λΌ μžˆλ‹€λ©΄, μ˜ˆμ™Έλ„ ν‹€λ¦΄μˆ˜ μžˆλ‹€.
  • μ–‘μ§ˆμ˜ μ†Œν”„νŠΈμ›¨μ–΄λŠ” μ˜ˆμ™Έκ°€ μ•„λ‹ˆλΌ μ² μ €ν•œ ν…ŒμŠ€νŠΈ κ³„νšμ—μ„œ λ§Œλ“€μ–΄μ§„λ‹€λŠ” 점을 κΈ°μ–΅ν•˜μž.