exception ν΄λμ€
c++ μμΈλ€μ μ£Όλͺ©μ μ, μ€λμμ λ°©μ§νλ νλ‘κ·Έλ¨μ μ€κ³ν μ μλλ‘ μΈμ΄ μ°¨μμμ μμνλ κ²μ΄λ€.
μ΅μ c++ μ»΄νμΌλ¬λ€μ μΈμ΄ μ체μ μμΈλ€μ ν¬ν¨μν€κ³ μλ€. μλ₯Ό λ€μ΄, exception ν€λ νμΌμ λ€λ₯Έ μμΈ ν΄λμ€λ€μ κΈ°μ΄ ν΄λμ€λ‘ μ¬μ©νλ exception ν΄λμ€λ₯Ό μ μνλ€. λν μ¬μ©μκ° μμ±νλ μ½λλ exception κ°μ²΄λ₯Ό λ°μμν€κ±°λ, exception ν΄λμ€λ₯Ό κΈ°μ΄ ν΄λμ€λ‘ μ¬μ©ν μ μλ€. what()μ΄λΌλ νλμ κ°μ λ©€λ² ν¨μκ° μ£Όμ΄μ§λ€. κ·Έκ²μ μμ€ν μ νΉμ±μ λ°λΌ νλμ λ¬Έμμ΄μ 리ν΄νλ€. κ·Έλ¬λ, μ΄ λ©μλλ κ°μμ΄κΈ° λλ¬Έμ, exception ν΄λμ€λ‘λΆν° νμλ ν΄λμ€ μμμ μ¬μ μ ν μ μλ€.
#include<exception>
class bad_hmean:public std::exception
{
public:
const char * what(){return "hmean()μ μλͺ»λ 맀κ°λ³μ";}
...
};
class bad_gmean:public std::exception
{
public:
const char *what(){return "gmean()μ μλͺ»λ 맀κ°λ³μ";}
...
};
μ΄ νμ μμΈλ€μ μλ‘ λ€λ₯΄κ² μ²λ¦¬νκΈ°λ₯Ό μνμ§ μλλ€λ©΄, λμΌν κΈ°μ΄ ν΄λμ€ νΈλ€λ¬λ₯Ό κ°μ§κ³ κ·Έλ€μ ν¬μ°©ν μ μλ€.
try{
...
}
catch(std::exception &e)
{
cout<<e.what()<<endl;
...
}
stdexcept μμΈ ν΄λμ€
stdexcept ν€λ νμΌμ λͺ κ°μ§ μμΈ ν΄λμ€λ€μ λ μ μνλ€.
첫째, μ΄ ν€λνμΌμ logic_errorμ runtime_error ν΄λμ€λ₯Ό μ μνλ€. μ΄λ€μ exceptionμΌλ‘λΆν° publicλ‘ νμλλ€.
class logic_error: public exception {
public:
explicit logic_error(const string & what_arg);
...
};
class domain_error: public logic_error{
public:
explicit domain_error(const string & what_arg)
...
};
μ΄ λ§€κ°λ³μλ what() λ©μλμ μν΄ cμ€νμΌ λ¬Έμμ΄λ‘ 리ν΄λ λ¬Έμ λ°μ΄ν°λ₯Ό μ 곡νλ€.
μ΄ λ μλ‘μ΄ ν΄λμ€λ λ νμ ν΄λμ€λ€μ ν¨λ°λ¦¬λ₯Ό μν κΈ°μ΄ ν΄λμ€μ μν μ νλ€. logic_error ν¨λ°λ¦¬λ, μΌλ°μ μΈ λ Όλ¦¬ μλ¬λ€μ μμ νλ€. κ° ν΄λμ€μ μ΄λ¦λ€μ 보면 κ·Έλ€μ΄ μ΄λ€ μ’ λ₯μ μλ¬λ₯Ό λ³΄κ³ νλμ§ μ μ μλ€.
domain_error
invalid_argument
legth_error
out_of_bounds
κ°κ°μ ν΄λμ€λ, μ¬μ©μκ° what() λ©μλμ μν΄ λ¦¬ν΄λλ λ¬Έμμ΄μ μ 곡νλ, logic_errorμ μμ±μμ κ°μ, μμ±μλ₯Ό κ°μ§κ³ μλ€.
runtime_error ν¨λ°λ¦¬λ, μ€ννλ λμμ λνλ μ μλ μλ¬λ€μ μμ νλ€. κ° ν΄λμ€μ μ΄λ¦λ€μ 보면, κ·Έλ€μ΄ μ΄λ€ μ’ λ₯μ μλ¬λ₯Ό λ³΄κ³ νλμ§ μ μ μλ€.
range_error
overflow_error
underflow_error
κ°κ°μ ν΄λμ€λ, μ¬μ©μκ° what() λ©μλμ μν΄ λ¦¬ν΄λλ λ¬Έμμ΄μ μ 곡νλ, runtime_error μμ±μμ κ°μ μμ±μλ₯Ό κ°μ§κ³ μλ€.
ννΈ, μμ κ΄κ³λ μνλ€λ©΄ κ·Έλ€μ μΌκ΄μ μΌλ‘ ν¨κ» λ€λ£¨λ κ²μ νμ©νλ€. μλ₯Ό λ€λ©΄ λ€μκ³Ό κ°μ μ½λλ out_of_bounds μμΈλ₯Ό κ°λ³μ μΌλ‘ ν¬μ°©νκ³ , λλ¨Έμ§ logic_error μμΈ ν¨λ°λ¦¬λ₯Ό νλμ κ·Έλ£ΉμΌλ‘ μ²λ¦¬νκ³ , exception κ°μ²΄, runtime_error κ°μ²΄ ν¨λ°λ¦¬, exceptionμΌλ‘λΆν° νμλ λλ¨Έμ§ μμΈ λ°μ΄ν°νλ€μ μ§ν©μ μΌλ‘ μ²λ¦¬νλ€.
try
{...}
catch(out_of_bounds &oe) //out_of_bounds μλ¬λ₯Ό ν¬μ°©νλ€.
{...}
catch(logic_error &oe) //λλ¨Έμ§ logic_error ν¨λ°λ¦¬λ₯Ό ν¬μ°©νλ€.
{...}
catch(exception &oe) //runtime_error, exception κ°μ²΄λ€μ ν¬μ°©νλ€.
{...}
-bad_alloc μμΈμ new
c++ μμ€ν λ€μ newλ₯Ό μ¬μ©ν λ μΌμ΄λλ λ©λͺ¨λ¦¬ λμ λ¬Έμ λ₯Ό ν΄κ²°νλ λ κ°μ§ λ°©λ²μ μ 곡νλ€.
첫 λ²μ§Έ λ°©λ²μ λ©λͺ¨λ¦¬ μμ²μ μΆ©μ‘±μν¬ μ μμ κ²½μ° newκ° λ ν¬μΈν°λ₯Ό 리ν΄νλ κ²μ΄λ€. λ λ²μ§Έ λ°©λ²μ newκ° bad_alloc μμΈλ₯Ό λ°μμν€λ κ²μ΄λ€. new ν€λνμΌμλ exception ν΄λμ€μμ publicμΌλ‘ νμλ bad_alloc ν΄λμ€μ μ μΈμ΄ λ€μ΄μλ€.
μμΈ, ν΄λμ€, μμ
μμΈ, ν΄λμ€, μμμ μλ‘ μνΈμμ©νλ€.
- νλμ μμΈ ν΄λμ€λ₯Ό λ€λ₯Έ κ²μΌλ‘λΆν° νμμν¬ μ μλ€.
- ν΄λμ€ μ μ μμ μμΈ ν΄λμ€ μ μΈμ λ΄ν¬μν΄μΌλ‘μ¨ μμΈλ€μ ν΄λμ€ μμ λ³ν©μν¬ μ μλ€.
- κ·Έλ κ² λ΄ν¬λ μ μΈλ€μ μμλ μ μμΌλ©°, κ·Έλ€ μμ μ΄ κΈ°μ΄ ν΄λμ€μ μν μ ν μ μλ€.
μλͺ»λ μμΈ
μμΈκ° λ°μν νμλ, λ¬Έμ λ₯Ό μΌμΌν¬ μ μλ λ κ°μ§ κ°λ₯μ±μ΄ μλ€.
μμΈκ° μμΈμ§μ μ μ¬μ©νλ ν¨μ μμμ λ°μνλ©΄, κ·Έ μμΈλ μμΈ μ§μ μ 리μ€νΈμ μλ λ°μ΄ν°νλ€ μ€μ μ΄λ νλμ μΌμΉν΄μΌ νλ€. λ§μ½ μμΈκ° μμΈ μ§μ κ³Ό μΌμΉνμ§ μμΌλ©΄, κ·Έ μμΈλ κΈ°λνμ§ μλ μμΈ(unexcepted exception)λΌλ λμΈμ΄ μ°νκ³ , κΈ°λ³Έμ μΌλ‘ νλ‘κ·Έλ¨ μ€νμ΄ μ€μ§λλ€. μμΈκ° μ΄ μ²« λ²μ§Έ μ₯μ λ¬Όμ λ°μ΄λμ΄λ μμΈλ λ°λμ ν¬μ°©λμ΄μΌ νλ€. μμΈκ° ν¬μ°©λμ§ μμΌλ©΄, ν¬μ°©λμ§ μλ μμΈ(uncaught exception)λΌλ λμΈμ΄ μ°νκ³ , κΈ°λ³Έμ μΌλ‘ νλ‘κ·Έλ¨ μ€νμ΄ μ€μ§λλ€. κ·Έλ¬λ κΈ°λνμ§ μλ μμΈλ ν¬μ°©λμ§ μλ μμΈμ λν νλ‘κ·Έλ¨μ μλ΅μ μ¬μ©μκ° λ°κΏ μ μλ€.