05
main thema : ์์ธ์ฒ๋ฆฌ.
https://www.youtube.com/watch?v=tTG-VrkLRpk
https://wikidocs.net/29948
1. ์์ธ ๊ฐ๋
1.1 ์์ธ๋
Exceptions are run-time anomalies(such as losing a database connection or encountering unexpected input)that exist outside the normal functioning of a program. Dealing with anomalous behavior can be one of the most difficult parts of designing any system. -c++ primer 5th-
๋ฐํ์์ ์ธ๋ถ์ ์ํด ๋ฐ์ํ ์๋ํ ๊ธฐ๋ฅ ์ด์ธ์ ๋์๋ค์ด๋ค. ์ธ๋ถ์ ์์ธ์ ์ํด ๋ฐ์ด์ค์ ์ฐ๊ฒฐ์ด ๊ฐ์๊ธฐ ๋๊ธด๋ค๋์ง, ๊ท๊ฒฉ ์ธ์ ์ ๋ ฅ ๋ฑ์ด ์๋ค. (๋์๋ ์ธ๊ทธํดํธ๋ ๋ด๋ถ์ ์ธ ๋ฌธ์ ์ด๋ฏ๋ก ์๋ฌ์ด๋ค)
1.2 ์์ธ์ฒ๋ฆฌ๋
Exception handling is generally used when one part of a program detects a problem that it cannot resolve and the problem is such that the detecting part of the program cannot continue. In such cases, the detecting part needs a way to signal that something happened and that it cannot continue. Moreover, the detecting part needs a way to signal the problem without knowing what part of the program will deal with the exceptional condition. Having signaled what happened, the detecting part stops processing. -c++ primer 5th-
์์ ๊ฐ์ ์์ธ๋ฅผ ๊ฐ์งํ๊ณ , ์์ธ๊ฐ ๋ฐ์ํ ๊ฒฝ์ฐ ์ด๋ป๊ฒ ์ ํธ๋ฅผ ๋ณด๋ด๊ณ ๋์ํ ์ง ์ ํ๋๊ฒ์ด ์์ธ ์ฒ๋ฆฌ์ด๋ค.
2 ์์ธ์ฒ๋ฆฌ์ ํ์ํ ์์๋ค.
2.1 throw
์์ธ๋ฅผ ๊ฐ์งํ๋๊ฑด if๋ฌธ ๋ฑ ์กฐ๊ฑด๋ฌธ์ ํตํด ํ์ธ์ ํ๋ค. ๊ทธ๋ฆฌ๊ณ ๋ฐ์ํ ์์ธ๋ฅผ ๋์ง๋๋ throw()ํค์๋๋ฅผ ์ฌ์ฉํ๋ค.
// ์์ธ ๋ช
์ธ : ์ด๋ค ์์ธ๋ฅผ ๋์ง์ง ๋ช
์ํ๋ ๊ฒ.
// throw() : ์์ธ ์์ -> c++11๋ถํฐ๋ noexcept์ฌ์ฉ.
// throw(ํด๋์ค) : ํด๋น ํด๋์ค์ ํด๋นํ๋ ๊ฐ์ฒด ์ธ์คํด์คํ ํ์ฌ throw.
// ์ด ํจ์๋ std::exception์ค ํ๋๋ฅผ ๋์ง๊ฒ์ด๋ค. std::exception์ ๊ฒฝ์ฐ ๋คํ์ฑ์ด ์ฌ์ฉ๋จ.
void func1() throw (std::exception)
{
...
// std::exception๋ฅผ ์์? ๊ตฌํ? ํ์ฅ? ํ ์ปค์คํ
std์์ธ์ ์์ฑ์ ํธ์ถ.
throw (CustonStdException());
}
throw๊ฐ ๋ฐ์ํ ์ดํ์ ์ฝ๋๋ ์ ๋ถ ์ํ๋์ง ์๋๋ค(throwํ ํจ์ ๋ฐ์์๋). ์ด์ ๊ด๋ จ๋ ๋ด์ฉ์ ์คํ ํ๊ธฐ(Stack Unwinding) ๊ฒ์.
2.2 try catch
์์์ ๋์ง ์์ธ ์ธ์คํด์ค๋ฅผ ๋ฐ์์ ์์ธ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ถ๋ถ์ด try-catch๋ฌธ์ด๋ค.
try
{
...
func1(); // ์์ธ ๋ฐ์
// ์์ธ ๋ฐ์์, try๋ด๋ถ ์ดํ์ ์ฝ๋๋ ์ํํ์ง ์๋๋ค.
}
catch(std::exception& e)
{
// ๋ฐ์ํ ์์ธ ํ์
std::cerr << e.what() << '\n';
}
try๋ก ๋ฌถ๋ ๊ธฐ์ค : ์์ธ๋ฌธ๋ง ๋ฃ์๊ฒ ์๋๋ผ, ์ด์ ๊ด๋ จ๋ ๋ชจ๋ ์์ ์ ๋ค ๋ฃ์ด์ ๊ด๋ จ๋ ๋ฐ์ํ ์์ธ์ ๊ด๋ จ๋ ๋ชจ๋ ๊ฒ๋ค์ด ์ฒ๋ฆฌ๋์ด์ผํ๋ค.
ํ์ค ์๋ฌ ํด๋์ค ์ ์ ? ์๋ฌ ํด๋์ค
ex00
๋ชฉ์ : ํ์ค ์์ธ ํด๋์ค ์์ฑ ๋ฐ ์ฌ์ฉ.
In file included from Bureaucrat.cpp:3:
./Bureaucrat.hpp:26:8: error: exception specification of overriding function is more lax than base version
class GradeTooHighException: public std::exception
^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/exception:101:13: note: overridden virtual function is here
virtual ~exception() _NOEXCEPT;
^
...
class _LIBCPP_EXCEPTION_ABI exception
{
public:
_LIBCPP_INLINE_VISIBILITY exception() _NOEXCEPT {}
virtual ~exception() _NOEXCEPT;
virtual const char* what() const _NOEXCEPT;
};
์ํ์์ exceptionํด๋์ค๋ ๋ค์๊ณผ ๊ฐ์ด ์ ์๋์ด์๋ค.
c++์์ ํด๋์ค์ ์๋ฉธ์๋ฅผ ๋ช ์์ ์ผ๋ก ์์ํ์ง ์์ผ๋ฉด, ์ปดํ์ผ๋ฌ๊ฐ ์๋์ผ๋ก ์์ฑํ๊ณ , ์ด๋ ์๋ฉธ์๊ฐ noexcpet(๊ตฌ throw())ํํ๋ก ์์ฑํด์ฃผ์ง ์์์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋๊ฑธ๋ก ๋ณด์ธ๋ค.
This isnโt telling the whole story. Compiler generated destructor will have a nothrow specification if all the functions it directly invokes allow no exceptions (destructors of non-static data members and destructors of base classes). The example fails to compile because std::string memberโs destructor isnโt marked throw(). Try replacing it with const char* and see the difference. โ jrok Aug 24, 2013 at 9:54
์คํ ์ค๋ฒํ๋ก์ฐ์ ๋ฐ๋ฅด๋ฉด, ์ปดํ์ผ๋ฌ๊ฐ ์์์ ์ผ๋ก ์๋ฉธ์๋ฅผ ํธ์ถํ ๋, ๋งด๋ฒ๋ค์ด noexcept(throw())๊ฐ ๋ณด์ฅ๋ ๋ noexcept(true)๋ก ์์ฑ๋๋ค.
- Bureaucrat ํด๋์ค์ ๋งด๋ฒ ์ค์ std::stringํ์ธ ๋งด๋ฒ ๋ณ์๊ฐ ์๋ค.
- ์๋ฉธ์๋ฅผ ํธ์ถํ ๋ ํธ์ถ๋ std::string์ ์๋ฉธ์๊ฐ ํธ์ถ๋๋ค.
- ๊ทธ๋ฌ๋ std::string์ ์๋ฉธ์๋ noexcept(true)๊ฐ ์๋๋ค(๋ณด์ฅํ์ง ์๋๋ค).
- ๋ฐ๋ผ์ Bureaucrat ํด๋์ค์ ์๋ฉธ์๋ฅผ ์์์ ์ผ๋ก ์์ฑํ ๋ noexcept(true)๋ฅผ ํ์ง ์์์ ์ปดํ์ผ ์๋ฌ๊ฐ ๋ฐ์ํ๋ค.
std::string์ const char *ํํ๋ก ์ฌ์ฉํ๋ฉด ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ง ์๋๋ค.