U E D R , A S I H C RSS

More EffectiveC++/Exception

1. Exception

1.1. Item 9: Use destuctors to prevent resource leaks.

  • Item 9: ์ž์›์ด ์ƒˆ๋Š”๊ฑธ ๋ง‰๋Š” ํŒŒ๊ดด์ž๋ฅผ ์‚ฌ์šฉํ•ด๋ผ.

๊ท€์—ฌ๋ธ ๋™๋ฌผ๋“ค ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์–ด ๋ณด์ž.

ALA๋Š” (Adorable Little Animal์ด๋‹ค.)
~cpp 
    class ALA{
    publid:
        virtual void processAdiption() = 0;
        ...
    };
    class Puppy: public ALA{
    publid:
        virtual void processAdiption();
        ...
    };
    class Kitten: pubic ALA{
    publid:
        virtual void processAdiption();
        ...
    };

์ผ๋‹จ ์—ฌ๋Ÿฌ๋ถ„์€ ํŒŒ์ผ์—์„œ ๋ถ€ํ„ฐ puppy์™€ kitten์™€ ํ‚คํŠผ์˜ ์ •๋ณด๋ฅผ ์ด๋ ‡๊ฒŒ ์ฝ๊ณ  ๋งŒ๋“ ๋‹ค. ์‚ฌ์‹ค Item 25์— ์–ธ๊ธ‰ํ•  virtual constructor๊ฐ€ ์ œ๊ฒฉ์ด์ง€๋งŒ, ์ผ๋‹จ ์šฐ๋ฆฌ์— ๋ชฉ์ ์— ๋งž๋Š” ํ•จ์ˆ˜๋กœ ๋Œ€์ฒดํ•œ๋‹ค.
~cpp 
    ALA * readALA(istream& s);

๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋А๋‚Œ(?)์œผ๋กœ ์ถœ๋ ฅํ•œ๋‹ค.
~cpp 
    void processAdoptions( istream& dataSource)
    {
        while (dataSource) {
            ALA *pa = readALA(dataSource);
            pa->processAdoption();
            delete pa;
        }
    }
pa์— ํ•ด๋‹นํ•˜๋Š” processAdoption()์€ ์˜ค๋ฅ˜์‹œ์— exception์„ ๋˜์ง„๋‹ค. ํ•˜์ง€๋งŒ, exception์‹œ์— ํ•ด๋‹น ์ฝ”๋“œ๊ฐ€ ๋ฉˆ์ถ˜๋‹ค๋ฉด "delete pa;"๊ฐ€ ์ˆ˜ํ–‰๋˜์ง€ ์•Š์•„์„œ ๊ฒฐ๊ตญ ์ž์›์ด ์ƒˆ๋Š” ํšจ๊ณผ๊ฐ€ ์žˆ๊ฒ ์ง€ ๊ทธ๋ ‡๋‹ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ๋‹จ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๋ฅผ ํ•œ๋‹ค. ๋ฌผ๋ก  ํ•ด๋‹น ํ•จ์ˆ˜์—์„œ propagateํ•ด์ฃผ์–ด ํ•จ์ˆ˜ ์ž์ฒด์—์„œ๋„ ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ ์‹œํ‚จ๋‹ค.

~cpp 
    void processAdoptions( istream& dataSource)
    {
        while (dataSource) {
            ALA *pa = readALA(dataSource);
            try{
                pa->processAdoption();
            }
            catch ( ... ) {
                delete pa;
                throw;
            }
            delete pa;
        }
    }
๋ฐฉ๋ฒ•์€ ์˜ฌ๋ฐ”๋ฅด๋‹ค. ์˜ˆ์™ธ์‹œ์— ํ•ด๋‹น ๊ฐ์ฒด๋ฅผ ์ง€์›Œ ๋ฒ„๋ฆฌ๋Š”๊ฒƒ, ๊ทธ๋ฆฌ๊ณ  ์ด๊ฑด ์šฐ๋ฆฌ๊ฐ€ ๋ฐฐ์šด try-catch-throw๋ฅผ ์ถฉ์‹คํžˆ ์‚ฌ์šฉํ•œ ๊ฒƒ์ด๋‹ค. ํ•˜์ง€๋งŒ.. ๋ณต์žกํ•˜์ง€ ์•Š์€๊ฐ€? ํ•ด๋‹น ์ฝ”๋“œ๋Š” ๋ง๊ทธ๋Œ€๋กœ ํŽผ์ณ์ง„๋‹ค.(์˜์„œ์˜ ํ‘œํ˜„) ๊ทธ๋ฆฌ๊ณ  ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ๋„ ๋–จ์–ด์ง€๋ฉฐ, ์ฐจํ›„ ๊ด€๋ฆฌ ์ฐจ์›์—์„œ ์ถ”๊ฐ€ ์ฝ”๋“œ์˜ ๋ฐœ์ƒ์‹œ์—๋„ ์–ด๋А ์˜์—ญ์— ๋ณด๊ฐ•ํ• ๊ฒƒ ์ธ๊ฐ€์— ๊ด€ํ•˜์—ฌ ๋ฌธ์ œ์‹œ ๋œ๋‹ค.

์—ฌ๊ธฐ์—์„œ ์žฌ๋ฏธ์žˆ๋Š” ๊ธฐ๋ฒ•์„ ์ด์•ผ๊ธฐ ํ•ด๋ณธ๋‹ค. ์ฐจ์ฐจ ์†Œ๊ฐœ๋  smart pointer์™€ ๋”๋ถˆ์–ด Standard C++ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ํฌํ•จ๋˜์–ด ์žˆ๋Š” auto_ptr template ํด๋ž˜์Šค๋ฅผ ์ด์šฉํ•œ ํ•ด๊ฒฐ์ฑ…์ธ๋ฐ auto_prt์€ ์ด๋ ‡๊ฒŒ ์ƒ๊ฒผ๋‹ค.

~cpp 
    template<class T>
    class auto_ptr{
    public:
        auto_ptr(T *p = 0) : ptr(p) {}
    private:
        T *ptr;
    };

๊ทธ๋ฆฌ๊ณ  ํ•ด๋‹น auto_prt์˜ ์ ์šฉํ•œ ๋ชจ์Šต์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณด์ธ๋‹ค.
~cpp 
    void processAdoptions(istream& dataSource)
    {
        while (dataSource){
            auto_ptr<ALA> pa(readALA(dataSource));
            pa->processAdoption();
        }
    }

์˜ˆ์™ธ ๋ฐœ์ƒ์‹œ์— ํ•จ์ˆ˜๊ฐ€ ์ข…๋ฃŒ๋˜๋ฉด auto_ptr์ƒ์˜ ๊ฐ์ฒด๋Š” ๋ฌด์กฐ๊ฑด ํ•ด์ œ๋œ๋‹ค.

์ž์ž ๋‹ค์Œ ์ฝ”๋“œ๋„ ์ž์›์ด ์…€๊ฒƒ์ด๋‹ค.
~cpp 
    void displayIntoInfo(const Information& info)
    {
        WINDOW_HANDLE w(createWindow());
        display info in window corresponding to w;
        destroyWindow(w);
    }

์ผ๋ฐ˜์ ์œผ๋กœ C์˜ ๊ฐœ๋…์œผ๋กœ ์งœ์—ฌ์ง„ ํ”„๋กœ๊ทธ๋žจ๋“ค์€ createWindow and destroyWindow์™€ ๊ฐ™์ด ๊ด€๋ฆฌํ•œ๋‹ค. ๊ทธ๋ ‡์ง€๋งŒ ์ด๊ฒƒ ์—ญ์‹œ destroyWindow(w)์— ๋„๋‹ฌ์ „์— ์˜ˆ์™ธ ๋ฐœ์ƒ์‹œ ์ž์›์ด ์„ธ๋Š” ๊ฒฝ์šฐ๊ฐ€ ์ƒ๊ธด๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ฐ”๊พธ์–ด์„œ ํ•ด๋ณธ๋‹ค.

~cpp 
    class WidnowHandle{
    public:
        WindowHandle(WINDOW_HANDLE handle) : w(handle) {}
        ~WindowHandle() {destroyWindow(w); }
        
        operator WINDOW_HANDLE() {return w;}
    private:
        WINDOW_HANDLE w;
    
        WindowHandle(const WindowHandle&);
        WindowHandle&   operator=(const WindowHandle);

auto_ptr๊ณผ ๊ฐ™์€ ์›๋ฆฌ์ด๋‹ค.
~cpp 
    void displayIntoInfo(const Information& info)
    {
        WINDOW_HANDLE w(createWindow());
        display info in window corresponding to w;
    }

1.2. Item 10: Prevent resource leaks in constructors.

  • Item 10: ์ƒ์„ฑ์ž์—์„œ ์ž์›์ด ์„ธ๋Š”๊ฑธ ๋ง‰์•„๋ผ.

์ž ๋‹น์‹ ์ด ๋ฉ€ํ‹ฐ๋ฏธ๋””์–ด ์ฃผ์†Œ๋ก์„ ๋งŒ๋“ ๋‹ค๊ณ  ์ƒ์ƒํ•˜๊ณ , ํ”„๋กœ๊ทธ๋žจ์„ ์งœ๋ณด์ž ์ „ํ™”๋ฒˆํ˜ธ, ๋ชฉ์†Œ๋ฆฌ, ์‚ฌ์ง„, ์ด๋ฆ„ ๋”ฐ์œ„๊ฐ€ ๋“ค์–ด๊ฐ€์•ผ ํ• ๊ฒƒ์ด๋‹ค. ๋‹ค์Œ ๋Œ€๊ฐ•์˜ ๊ตฌํ˜„ ์ฝ”๋“œ๋“ค์„ ๋ณด๋ฉด
~cpp 
    class Image{
    public:
        Image(const string& imageDataFileName);
    ...
    };

    class AudioClip{
    public:
        AudioClip(const string& audioDataFileName);
        ...
    }
    class PhoneNumber{ ... };

    class BookEntry{
    public:
        BookEntry(const string& name,
                  const string& address = "",
                  const string& imageFileName = "",
                  const string& audioClipFileName = "");
        ~BookEntry();

        void addPhoneNumber(const PhoneNumber& number);
    
    private:
        string the Name;
        string the Address;
        list<phoneNumber> thePhones;
        Image *theImage;
        AudioClip *theAudioClip;
    };

๊ฐ๊ฐ์˜ BookEntry๋Š” ์ด๋ฆ„๊ณผ ๋”๋ถˆ์–ด ๋‹ค๋ฅธ ํ•„๋“œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ ๊ธฐ๋ณธ ์ƒ์„ฑ์ž๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

~cpp 
    // ๊ธฐ๋ณธ ์ƒ์„ฑ์ž
    BookEntry::BookEntry(const string& name,
                         const string& address,
                         const string& imageFileName,
                         const string& audioClipFileName)
    :theName(name), theAddress(address), theImage(0), theAudioClip(0)
    {
        if (imageFileName != ""){       // ์ด๋ฏธ์ง€๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
            theImage = new Image(imageFileName);
        }

        if (audioClipFileName != "") {  // ์†Œ๋ฆฌ ์ •๋ณด๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
            theAudioCilp = new AudioClip( audioClipFileName);
        }
    }
    BookEntry::~BookEntry()
    {
        delete theImage;
        delete theAudioClip;
    }

์ƒ์„ฑ์ž๋Š” theImage์™€ theAudioClip๋ฅผ null๋กœ ์ดˆ๊ธฐํ™” ์‹œํ‚จ๋‹ค. C++์ƒ์—์„œ null๊ฐ’์ด๋ž€ delete์ƒ์—์„œ์˜ ์•ˆ์ „์„ ๋ณด์žฅํ•œ๋‹ค. ํ•˜์ง€๋งŒ... ์œ„์˜ ์ฝ”๋“œ์ค‘์— ๋‹ค์Œ ์ฝ”๋“œ์—์„œ new๋กœ ์ƒ์„ฑํ• ์‹œ์— ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒ๋œ๋‹ค๋ฉด?
~cpp 
    if (audioClipFileName != "") {
        theAudioClip = new AudioClip(audioClipFileName);
    }

์ž์ž ์˜ˆ๋ฅผ๋“ค์–ด์„œ ์ด๋Ÿฐ ํ•จ์ˆ˜์—์„œ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์•ผํ• ๊ฒƒ์ด๋‹ค.
~cpp 
    void testBookEntryClass()
    {
        BookEntry b( "Addison-Wesley Publishing Company", "One Jacob Way, Reading, MA 018678");
        ...
    }

์ด๋ ‡๊ฒŒ try-catch-throw๋กœ ๋ง์ด๋‹ค.
~cpp 
    void testBookEntryClass()
    {
        BookEntry *pb = 0;
        try{
            pb = new BookEntry( "Addison-Wesley Publishing Company", "One Jacob Way, Reading, MA 018678");
        }
        catch ( ... ) {
            delete pb;
            throw;
        }
        delete pb;
    }

์ด๋ ‡๊ฒŒ ํ•ด๋„ ์—ฌ์ „ํžˆ ๋ฌธ์ œ๋Š” ๋‚จ๋Š”๋‹ค. ๋ฌด์—‡์ด๋ƒ ํ•˜๋ฉด, ๋งŒ์•ฝ BookEntry์˜ ์ƒ์„ฑ์ž์ค‘์—์„œ AudioClip ๊ฐ์ฒด ์ƒ์„ฑ์ค‘์— ์˜ˆ์™ธ๋ฅผ propagateํ•˜๋ฉด ๋ฐ”๋กœ ์œ„ ์ฝ”๋“œ์ค‘ pb ํฌ์ธํ„ฐ์— null์„ ๋ฐ˜ํ™˜ํ•ด ๋ฒ„๋ฆฐ๋‹ค. ๋ฐ˜๋‚ฉ๋œ ์ด๋ ‡๊ฒŒ ๋˜๋ฉด ์ด๋ฏธ ์ •์ƒ์ ์œผ๋กœ ์ƒ์„ฑ๋œ theImage๋ฅผ ์ง€์šฐ์ง€ ๋ชปํ•˜๋Š” ์‚ฌํƒœ๊ฐ€ ๋ฐœ์ƒํ•ด ๋ฒ„๋ฆฌ๋Š” ๊ฒƒ์ด๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ์ƒ์„ฑ์ž์˜ ๋‚ด๋ถ€์—์„œ ๋‹ค์‹œ try-catch-throw๋กœ ํ•ด์•ผ ํ• ๊ฒƒ์ด๋‹ค.

~cpp 
    BookEntry::BookEntry(const string& name,
                         const string& address,
                         const string& imageFileName,
                         const string& audioClipFileName)
    :theName(name), theAddress(address), theImage(0), theAudioClip(0)
    {
        try{
            if (imageFileName != ""){
                theImage = new Image(imageFileName);
            }

            if (audioClipFileName != "") {
                theAudioCilp = new AudioClip( audioClipFileName);
            }
        }
        catch (...){
            delete theImage;
            delete theAudioClip;
            throw;
        }
    }

์ž ์ด๋ ‡๊ฒŒ ํ•ด์ฃผ๋ฉด ๋ฌธ์ œ ๋ ๊ฒƒ์ด ์—†๋‹ค. ์ž ์ด์ƒํƒœ์— refactoring์ด ํ•„์š”ํ•œ ์ฝ”๋“œ๋“ค์ด ๋ณด์ผ๊ฒƒ์ด๋‹ค ํ•˜๊ฒ ๋‹ค. delete๋ถ€๋ถ„์„ ํ•จ์ˆ˜๋กœ ์—ญ์–ด ๋„ค๋Š” ๊ฒƒ์ด๋‹ค.

~cpp 
    class BookEntry{
    public:
        ...
    private:
        ...
        void cleanup(); // ์ด๊ฒƒ์ด ๊ฐ์ฒด๋ฅผ ์‚ญ์ œํ•˜๋Š”๊ฑธ ๋ฌถ์€๊ฒƒ
    };

~cpp 
    BookEntry::BookEntry(const string& name,
                         const string& address,
                         const string& imageFileName,
                         const string& audioClipFileName)
    :theName(name), theAddress(address), theImage(0), theAudioClip(0)
    {
        try{
            ...
        }
        catch (...){
            cleanup();
            throw;
        }
    }
    BookEntry::~BookEntry{
        cleanup();
    }

์ž ์ด์ œ ๊นจ๋—์ด ํ•ด๊ฒฐ ๋œ ๊ฒƒ์œผ๋กœ ๋ณด์ธ๋‹ค. ํ•˜์ง€๋งŒ ์ด๋ฒˆ์—๋Š” ์ด๋Ÿฐ ๊ฒฝ์šฐ๋ฅผ ์ƒ์ •ํ•ด ๋ณด์ž

~cpp 
    class BookEntry{
    public :
        ...
    private:
        ...
        Image * const theImage;
        AudioClip * const theAudioClip;
    }

์ด๋Ÿฐ const ํฌ์ธํ„ฐ์˜ ๊ฒฝ์šฐ์—๋Š” ๋ฐ˜๋“œ์‹œ ์ดˆ๊ธฐํ™” ๋ฆฌ์ŠคํŠธ๋ฅผ ์ด์šฉํ•˜์—ฌ ์ธ์ž๋ฅผ ์ดˆ๊ธฐํ™” ํ•ด์ฃผ์–ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ์ด๋‹ค.

~cpp 
    class BookEntry{
    public :
        ...
    private:
        ...
        Image * initImage(const string& imageFileName);
        AudioClip * initAudioClip(const string& theAudioClip);
    }

    BookEntry::BookEntry(const string& name,
                         const string& address,
                         const string& imageFileName,
                         const string& audioClipFileName)
    :theName(name), theAddress(address), 
     theImage(initImage(imageFileName)), theAudioClip(initAudioClip(AudioCilpFileName))
    {}
    // theImage๋Š” ๊ฐ€์žฅ ์ฒ˜์Œ ์ดˆ๊ธฐํ™” ๋˜์–ด์„œ ์ž์›์ด ์„ธ๋Š” ๊ฒƒ์—๋Œ€ํ•œ ๊ฑฑ์ •์ด ์—†๋‹ค. ๊ทธ๋ž˜์„œ ํ•ด๋‹น ์†Œ์Šค์—์„œ 
    // ์˜ˆ์™ธ์ฒ˜๋ฆฌ๋ฅผ ์ƒ๋žตํ•˜์˜€๋‹ค.
   Image * initImage(const string& imageFileName)
    {
        if (imageFileName != "") return new Image(imageFileName);
        else return 0;
    }
    // theAudioClip๋Š” ๋‘๋ฒˆ์งธ๋กœ ์ดˆ๊ธฐํ™” ๋˜๊ธฐ ๋•Œ๋ฌธ์—, ์˜ˆ์™ธ์˜ ๋ฐœ์ƒ๊ฒฝ์šฐ ์ด๋ฏธ ํ• ๋‹น๋˜์–ด์ง„ theImage์˜ ์ž์›์„ 
    //  ํ•ด์ œํ•ด์ฃผ๋Š” ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๊ฐ€ ํ•„์š”ํ•˜๋‹ค. 
    AudioClip * initAudioClip(const string& theAudioClip)
    {
        try{
            if (adioClipFileName != ""){
                return new AudioClip(audioClipFileName);
            }
            else return 0;
        }
        catch ( ... ){
            delete theImage;
            throw;
        }
    }
์ด๋Ÿฐ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ ์˜ฌ๋ฐ”๋ฅด๋‹ค ํ•˜์ง€๋งŒ, ์ด์ „์— ์–ธ๊ธ‰ํ•œ ๊ฒƒ๊ณผ ๊ฐ™์ด ์†Œ์Šค ์‚ฌํ›„ ๊ด€๋ฆฌ์™€ ํ˜„์žฌ ์†Œ์Šค ์ž์ฒด๋„ ๋งŽ์ด ์ง€์ €๋ถ„ํ•˜๋‹ค

๊ทธ๋ž˜์„œ ๋” ์ข‹์€ ๋ฐฉ๋ฒ•์€ Item 9์—์„œ ์–ธ๊ธ‰ํ•œ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
~cpp 
    class BookEntry{
    pubcli:
    ...
    private:
    ...
    const auto_ptr<Image> theImage;
    const auto_ptr<AudioClip> theAudioClip;
๊ทธ๋ฆฌ๊ณ  ์ƒ์„ฑ์ž์˜ ์ฝ”๋“œ๋ฅผ ์ด๋ ‡๊ฒŒ ํ•œ๋‹ค.
~cpp 
    BookEntry::BookEntry(const string& name,
                         const string& address,
                         const string& imageFileName,
                         const string& audioClipFileName)
    :theName(name), theAddress(address),
     theImage(imageFileName != "" ? new Image(imageFileName) : 0),
     theAudioClip( audioClipFileName != "" ? new AudioClip(audioClipFileName):0)
      {}

์ด๋ ‡๊ฒŒ ๋””์ž์ธ ํ• ๊ฒฝ์šฐ ํŒŒ๊ดด๋Š” ์ž๋™์œผ๋กœ ์ด๋ฃจ์–ด ์ง„๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ ํŒŒ๊ดด์ž๋Š”
~cpp 
    BookEntry::~BookEntry()
    {}
์ด๋ ‡๊ฒŒ ์•„๋ฌด๊ฒƒ๋„ ํ•ด์ฃผ์ง€ ์•Š์•„๋„ ๊ฐ์ฒด๊ฐ€ ๊ฐ™์ด ํŒŒ๊ดด๋˜๊ณ  ๋ฆฌ์†Œ์Šค๊ฐ€ ์ƒˆ๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ ํ• ์ˆ˜ ์žˆ๋‹ค.

1.3. Item 11: Prevent exception from leaving destuctors.

  • Item 11: ํŒŒ๊ดด์ž๋กœ ๋ถ€ํ„ฐ์˜ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๋ฅผ ๋ง‰์•„๋ผ.

ํŒŒ๊ดด์ž ํ˜ธ์ถœ์€ ๋‘๊ฐ€์ง€์˜ ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค. ์ฒซ๋ฒˆ์งธ๊ฐ€ 'normal'์ƒํƒœ๋กœ ๊ฐ์ฒด๊ฐ€ ํŒŒ๊ดด๋˜์–ด ์งˆ๋•Œ๋กœ ๊ทธ๊ฒƒ์€ ๋ณดํ†ต ๋ช…์‹œ์ ์œผ๋กœ delete๊ฐ€ ๋ถˆ๋ฆฐ๋‹ค. ๋‘๋ฒˆ์งธ๋Š” ์˜ˆ์™ธ๊ฐ€ ์ „๋‹ฌ๋˜๋ฉด์„œ ์Šคํƒ์ด ํ’€๋ฆด๋•Œ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ์‹œ(exception-handling) ๊ฐ์ฒด๊ฐ€ ํŒŒ๊ดด๋˜์–ด ์ง€๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค.

๋‹ค์Œ ์˜ˆ์ œ๋Š” online ์ปดํ“จํ„ฐ ์„ธ์…˜์„ ์œ„ํ•œ Session ํด๋ž˜์Šค๋ฅผ ์ƒ๊ฐํ•ด ๋ณธ ๊ฒƒ์ด๋‹ค. ๊ฐ ์„ธ์…˜ ๊ฐ์ฒด๋“ค์€ ์ƒ์„ฑ๊ณผ ํŒŒ๋˜๋œ ๋‚ ์งœ๋ฅผ ๊ธฐ๋กํ•ด์•ผ๋งŒ ํ•œ๋‹ค.
~cpp 
    class Session{
    public:
        Session();
        ~Session();
        ...
    private:
        static void logCreation(Session *objAddr);
        static void logDestruction(Session *objAddr);
    };

๋‹ค์Œ๊ณผ ๊ฐ™์ด ํŒŒ๊ดด์ž์—์„œ ๋กœ๊ทธ ๋ฐ์ดํ„ฐ๋ฅผ ๋‚จ๊ธด๋‹ค.
~cpp 
    Session::~Session()
    {
        logDestruction(this);
    }

์ž ์ด๊ฑด ๊ดœ์ฐฎ์•„ ๋ณด์ธ๋‹ค. ํ•˜์ง€๋งŒ ์ € logDestruction์ƒ์—์„œ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค๋ฉด ์–ด์ฉŒ๊ฒŒ ํ• ๊ฒƒ์ธ๊ฐ€? ํ•ด๋‹น ์†Œ์Šค๋Š” Session์˜ ํŒŒ๊ดด์ž ์•ˆ์—์„œ๋Š” ์˜ˆ์™ธ๋ฅผ ์žก์ง€ ๋ชปํ•œ๋‹ค. ๊ทธ๋ž˜์„œ ํ•ด๋‹น ํŒŒ๊ดด์ž๋ฅผ ํ˜ธ์ถœํ•œ ์ž์—๊ฒŒ ์˜ˆ์™ธ๋ฅผ ๋˜์ง„(์ „๋‹ฌํ•œ)๋‹ค. ๊ทธ๋ ‡์ง€๋งŒ ๋‹ค๋ฅธ ์—๋Ÿฌ๋“ค์ด ๋˜์ ธ์ง„ ์ƒํ™ฉ์—์„œ ํŒŒ๊ดด์ž๊ฐ€ ์Šค์Šค๋กœ ์ž์‹ ์„ ๋ถ€๋ฅธ๊ฑฐ๋ผ๋ฉด ํ•จ์ˆ˜์˜ ์ข…๋ฃŒ๊ฐ€ ์ž๋™์œผ๋กœ ์ด๋ฃจ์–ด์ง€๊ธฐ๋ฅผ ์›ํ•  ๊ฒƒ์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‹น์‹ ์˜ ํ”„๋กœ๊ทธ๋žจ์€ ์ด์ฏค์—์„œ ๋จธ์ถ”์–ด ๋ฒ„๋ฆด ๊ฒƒ์ด๋‹ค. -ํ•ด์„์ด ์ด์ƒํ•˜๊ตฐ, ์•”ํŠผ ๋‹ค๋ฅธ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ์‹œ์— ์„ธ์…˜ ํŒŒ๊ดด์ž ๋กœ๊ทธ์‹œ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค๋ฉด ํ”„๋กœ๊ทธ๋žจ์ด ๋ฉˆ์ถ˜๋‹ค๋Š” ์†Œ๋ฆฌ๋‹ค.

์•„๋งˆ ๋Œ€๋‹ค์ˆ˜์˜ ์‚ฌ๋žŒ๋“ค์ด ์ด๋Ÿฐ ์ƒํƒœ๋กœ ๋น ์ง€๋Š”๊ฑธ ์›ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด๋‹ค. Session ๊ฐ์ฒด์˜ ํŒŒ๊ดด๋Š” ๊ธฐ๋ก๋˜์ง€ ์•Š์„ ํƒœ๋‹ˆ๊นŒ. ๊ทธ๊ฑด ์ƒ๋‹นํžˆ ์ปค๋‹ค๋ž€ ๋ฌธ์ œ์ด๋‹ค ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ์ด ์ข€๋” ์‹ฌํ•œ ๋ฌธ์ œ๋ฅผ ์œ ๋ฐœํ•˜๋Š”๊ฑด ํ”„๋กœ๊ทธ๋žจ์ด ๋” ์ง„ํ• ์ˆ˜ ์—†์„ ๋•Œ ์ผ๊ฒƒ์ด๋‹ค. ๊ทธ๋ž˜์„œ Session์˜ ํŒŒ๊ดด์ž์—์„œ์˜ ์˜ˆ์™ธ ์ „๋‹ฌ์„ ๋ง‰์•„์•ผ ํ•œ๋‹ค. ๋ฐฉ๋ฒ•์€ ํ•˜๋‚˜ try-catch๋กœ ์žก์•„ ๋ฒ„๋ฆฌ๋Š” ๊ฒƒ์ด๋‹ค.
~cpp 
    Session::~Sessioni()
    {
        try{
            logDestruction(this);
        }
        catch ( ... ){
            cerr << "ํ•ด๋‹น ์ฃผ์†Œ์—์„œ ์„ธ์…˜ ๊ฐ์ฒด์˜ ํŒŒ๊ดด๊ธฐ๋ก์ด ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค."
                 << "-์ฃผ์†Œ:"
                 << this << ".\n";
    }       
ํ•˜์ง€๋งŒ ์ด๊ฒƒ๋„ ์›๋ž˜์˜ ์ฝ”๋“œ๋ณด๋‹ค ์•ˆ์ „ํ•  ๊ฒƒ์ด ์—†๋‹ค. ๋งŒ์•ฝ operator<< ๋ถ€๋ฅผ๋•Œ exception์ด ๋ฐœ์ƒํ•œ๋‹ค๋ฉด ํŒŒ๊ดด์ž๊ฐ€ ๋˜์ง€๋Š” exception์œผ๋กœ ๋‹ค์‹œ ์šฐ๋ฆฌ๊ฐ€ ํ•ด๊ฒฐํ•˜๊ณ ์ž ํ•˜๋Š” ์›์ ์œผ๋กœ ๋Œ์•„๊ฐ€ ๋ฒ„๋ฆฐ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด
~cpp 
    Session::~Sessioni()
    {
        try{
            logDestruction(this);
        }
        catch ( ... ){ }       
์ด๋ ‡๊ฒŒ ์•„๋ฌด๋Ÿฐ ์ฒ˜๋ฆฌ๋ฅผ ํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด logDestuction์—์„œ ๋ฐœ์ƒํ•œ ์˜ˆ์™ธ๊ฐ€ ์ „๋‹ฌ๋˜๋Š”๊ฑธ ๋ง‰๊ณ  ํ”„๋กœ๊ทธ๋žจ ์ค‘์ง€๋ฅผ ์œ„ํ•˜์—ฌ ์Šคํƒ์ด ํ’€๋ ค๋‚˜๊ฐ€๋Š”๊ฑธ ๋ง‰์„์ˆ˜๋Š” ์žˆ์„ ๊ฒƒ์ด๋‹ค.

ํ•˜์ง€๋งŒ ์ด๋Ÿฐ ๋‘๋ฒˆ์งธ์˜ ์ƒ๊ฐ๋„ ํŒŒ๊ดด์ž์—์„œ ๋ฐœ์ƒํ•˜๋Š” ๋ชจ๋“  ์—๋Ÿฌ๋ฅผ ๋ง‰์•„ ๋ฒ„๋ฆฌ๊ณ  ๊ทธ๋ƒฅ ๋„˜์–ด๊ฐ€ ๋ฒ„๋ฆฐ๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค.
๋ฐ‘์˜ ์ฝ”๋“œ๋Š” DB์˜ ํŠธ๋žœ์ ์…˜์„ ์ด์šฉํ•ด์„œ ์—๋Ÿฌ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ชจ์Šต์ด๋‹ค.
~cpp 
    Session::Session()
    {
        logCreation(this);
        startTransaction();
    }
    Session::~Session()
    {
        logDestruction(this);
        endTransaction();
    }
์ด๋Ÿด ๊ฒฝ์šฐ์—๋Š” Session์˜ ํŒŒ๊ดด์ž์—๊ฒŒ ๋ฌธ์ œ๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ๋ช…๋ น์„ ๋‹ค์‹œ ๋‚ด๋ฆด์ˆ˜ ์žˆ๋”ฐ ํ•˜์ง€๋งŒ endTransaction์ด ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒํžˆํ‚จ๋‹ค๋ฉด ๋‹ค์‹œ try-catch๋ฌธ์œผ๋กœ ๋Œ์•„ ๊ฐˆ์ˆ˜ ๋ฐ–์— ์—†๋‹ค.

๋‚œ์ œ๋‹ค ๋‚œ์ œ

1.4. Item 12: Understand how throwing an exception differs from passing a parameter or calling a virtual function

  • Item 12: ๊ฐ€์ƒ ํ•จ์ˆ˜ ๋ถ€๋ฅด๊ธฐ๋‚˜, ์ธ์ž ์ „๋‹ฌ๋กœ ์ฒ˜๋ฆฌ์™€ ์˜ˆ์™ธ์ „๋‹ฌ์˜ ๋ฐฉ๋ฒ•์˜ ์ฐจ์ด์ ์„ ์ดํ•ดํ•˜๋ผ.

๋‹ค์Œ์˜ ๊ฐ€์ƒํ•จ์ˆ˜์˜ ์„ ์–ธ๊ณผ ๊ฐ™์ด ๋‹น์‹ ์€ catch ๊ตฌ๋ฌธ์—์„œ๋„ ๋น„์Šทํ•˜๊ฒŒ ์ธ์ž๋“ค์„ ๋„ฃ์„์ˆ˜ ์žˆ๋‹ค.
~cpp 
    class Widget { ... };

    void f1(Widget w);
    void f2(Widget& w);
    void f3(const Widget w);
    void f4(Widget *pw);
    void f5(const Widget *pw);

    catch (Widget w) ...
    catch (Widget& w) ...
    catch (const Widget w) ...
    catch (Widget *pw) ...
    catch (const Widget *pw) ...

๊ทธ๋ž˜์„œ ์•„๋งˆ ํ•จ์ˆ˜ํ˜ธ์ถœ์—์„œ ์ธ์ž ์ „๋‹ฌ๊ณผ ๊ณผ ์˜ˆ์™ธ๊ฐ€ ์ „๋‹ฌ๋˜๋Š” ๊ฒƒ์ด ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ฐ™์€๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐ ํ• ์ง€๋„ ๋ชจ๋ฅธ๋‹ค. ๋ถ„๋ช… ๋‘˜์€ ๋น„์Šทํ•œ ๋ฉด์ด ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ์ค‘์š”ํ•œ ์ฐจ์ด์  ์—ญ์‹œ ์กด์žฌ ํ•œ๋‹ค.

์ž, ๋น„์Šทํ•œ ๋ฉด์€ ์–ธ๊ธ‰ํ•ด๋ณด๋ฉด, ํ•จ์ˆ˜ ์˜ˆ์™ธ ๋ชจ๋‘ ์— ์ธ์ž๋ฅผ ์ „๋‹ฌํ• ๋•Œ ์„ธ๊ฐ€์ง€๋กœ ์ „๋‹ฌํ• ์ˆ˜ ์žˆ๋‹ค. ๊ฐ’(by value)์ด๋ƒ ์ฐธ์กฐ(by reference)๋ƒ, ํ˜น์€ ํฌ์ธํ„ฐ(by pointer)๋ƒ ๋ฐ”๋กœ ์ด๊ฒƒ์ด๋‹ค. ํ•˜์ง€๋งŒ ์ด ํ•จ์ˆ˜์™€ ์˜ˆ์™ธ์—์„œ์˜ ์ธ์ž์˜ ์ „๋‹ฌ ๋ฐฉ์‹์€ ๊ตฌ๋™ ๋ฐฉ๋ฒ•์—์„œ ๊ฒฐ์ •์ ์ธ ์ฐจ์ด์ ์„ ๋ณด์ธ๋‹ค. ์ด๋Ÿฐ ์ฐจ์ด์ ์€ ๋‹น์‹ ์ด ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ• ๋•Œ ์ตœ์ข…์ ์œผ๋กœ ๋ฐ˜ํ™˜๋˜๋Š” ๊ฐ’(returns)์ด ํ•ด๋‹น ํ•จ์ˆ˜๋ฅผ ๋ถ€๋ฅด๋Š” ์œ„์น˜๋กœ ๊ฐ€์ง€๋งŒ, ์˜ˆ์™ธ์˜ ๊ฒฝ์šฐ์— throw์˜ ์œ„์น˜์™€ return์˜ ์œ„์น˜๊ฐ€ ๋‹ค๋ฅด๋‹ค๋Š” ์ ์—์„œ ๊ธฐ์ธํ•œ๋‹ค.

๋‹ค์Œ ํ•จ์ˆ˜์—์„œ Widget์˜ ์ธ์ž ์ „๋‹ฌ๊ณผ ์˜ˆ์™ธ์—์„œ์˜ ์ „๋‹ฌ์„ ์ƒ๊ฐํ•ด ๋ณด์ž.
~cpp 
    // ์ด ์†Œ์Šค๋Š” ์œ„์˜ Widget์˜ ์ผํ™˜์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋ฌด๋ฆฌ ์—†๊ฒ ๋‹ค.
    istream operator>>(istream& s, Widget& w);
    void passAndThrowWidget()
    {
        Widget localWidget;
        cin >> localWidget;
        throw localWidget;
    }

localWidget์ด operator>> ๋กœ ์ „๋‹ฌ๋ ๋•Œ๋Š” ๋ณต์‚ฌ์˜ ๊ณผ์ •์ด ์ผ์–ด๋‚˜์ง€ ์•Š๋Š”๋‹ค. ๋Œ€์‹  operator>> ์•ˆ์˜ ์ฐธ์กฐ w๊ฐ€ localWidget๊ณผ ๋ฌถ์—ฌ์„œ ์–ด๋– ํ•œ ๊ณผ์ •์„ ์ฒ˜๋ฆฌํ•˜๊ฒŒ ๋œ๋‹ค. ํ•˜์ง€๋งŒ ์˜ˆ์™ธ์˜ ์ฒ˜๋ฆฌ์—์„œ localWidget์€ ์ข€ ๋‹ค๋ฅธ ์ด์•ผ๊ธฐ๋ฅผ ๋งŒ๋“ค์–ด ๋‚˜๊ฐ„๋‹ค. ์˜ˆ์™ธ๊ฐ€ ๊ฐ’์ด๋‚˜, ์ฐธ์กฐ๋ฅผ ์žก๋“  ์žก์ง€(pointer๋Š” ์žก์ง€ ๋ชปํ•œ๋‹ค.) ์•Š๋“  ์ƒ๊ด€ ์—†์ด localWidget์˜ ์‚ฌ๋ณธ์ด ๋งŒ๋“ค์–ด์ง€๊ณ , ๊ทธ ์‚ฌ๋ณธ์€ catch๋กœ ์ €๋‚Ÿใ„น ๋œ๋‹ค. ์™œ๋ƒํ•˜๋ฉด passAndThrowWidget์˜ ์˜์—ญ์„ ๋ฒ—์–ด๋‚˜๋ฉด localWidget์˜ ํŒŒ๊ดด์ž์˜ ํ˜ธ์ถœ์ด ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ˜๋“œ์‹œ ์ด๋ ‡๊ฒŒ ๋˜์–ด์•ผ ํ•œ๋‹ค. ์ด๊ฒƒ์€ C++ ์—์„œ ์˜ˆ์™ธ๋Š” ํ•ญ์ƒ ์‚ฌ๋ณธ์œผ๋กœ ์ „๋‹ฌ๋œ๋‹ค๋Š” ์ด์œ ๊ฐ€ ๋œ๋‹ค.

์ด๋Ÿฐ ๋ณต์‚ฌ์˜ ๊ณผ์ •์€ ์•„๋ฌด๋ฆฌ ํŒŒ๊ดด์˜ ์œ„ํ—˜์ด ์—†๋Š” ์˜ˆ์™ธ๋ผ๋„ ์ด๋ฃจ์–ด ์ง„๋‹ค. ์˜ˆ๋ฅผ ๋“ค์ž๋ฉด

~cpp 
    void passAndThrowWidget()
    {
        static Widget localWidget;
        cin >> localWidget;
        throw localWidget;
    }

ํ•ด๋‹น ์‚ฌ๋ณธ์€ ๊ตฌ์ง€ ๋ณต์‚ฌํ•  ํ•„์š”๊ฐ€ ์—†์„ ๊ฒƒ์ด๋‹ค. ํ•˜์ง€๋งŒ catch ๋Š” ๋ณต์‚ฌํ•ด ๋‚˜๊ฐ€๊ณ  ๊ทธ๋ž˜์•ผ๋งŒ catch ์—์„œ localWidget์˜ ์‚ฌ๋ณธ์„ ํŽธ์ง‘ํ•ด์„œ ์ด์šฉํ• ์ˆ˜ ์žˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ณต์‚ฌ์˜ ๊ทœ์น™์€ ํ•จ์ˆ˜ ์ „๋‹ฌ๊ณผ ์˜ˆ์™ธ ์ธ์ž ์ „๋‹ฌ์˜ ์ฐจ์ด์ ์„ ์„ค๋ช…ํ•ด ์ค€๋‹ค.

๊ฐ์ฒด๊ฐ€ ์˜ˆ์™ธ๋ฅผ ์œ„ํ•˜์—ฌ ๋ณต์‚ฌ๊ฐ€ ๋ ๋•Œ ๋ณต์‚ฌ๋Š” ํ•ด๋‹น ๊ฐ์ฒด์˜ ๋ณต์‚ฌ์ƒ์„ฑ์ž(copy constructor)์— ์˜ํ•˜์—ฌ ์ˆ˜ํ–‰ ๋œ๋‹ค. ์ด ๋ณต์‚ฌ์ƒ์„ฑ์ž๋Š” ๊ฐ์ฒด์˜ dynamicํ˜•์ด ์•„๋‹Œ static ํ˜•์— ํ•ด๋‹นํ•˜๋Š” ํด๋ž˜์Šค์ค‘ ํ•˜๋‚˜์ด๋‹ค. ๊ฐœ๋…์˜ ํ™•์ธ์„ ์œ„ํ•ด ์œ„ ์†Œ์Šค์˜ ์ˆ˜์ • ๋ฒ„์ „์„ ์ƒ๊ฐํ•ด ๋ณด์ž
~cpp 
class Widget { ...}
class SpecialWidget: public Widget { ... };
void passAndThrowWidget()
{
    SpecialWidget localSpecialWidget;
    ...
    Widget& rw = localSpecialWidget;
    throw rw;                           // rw์˜ ํ˜• ์ฆ‰ Widget์˜ ๋ณต์‚ฌ์ƒ์„ฑ์ž๊ฐ€ ์ž‘๋™ํ•˜์—ฌ ๋ณต์‚ฌํ•ด ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค.
}

๋‹ค์Œ์˜ ๊ฒฝ์šฐ passAndThrowWidget ์ด ๋˜์ง€๋Š”๊ฑด Widget ์ด๋‹ค. ์œ„์—์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด static type์œผ๋กœ ์˜ˆ์™ธ๋Š” ์ „๋‹ฌ๋œ๋‹ค. ์ปดํŒŒ์ผ๋Ÿฌ๋Š” rw๊ฐ€ SpecialWidget์œผ๋กœ์˜ ๋™์ž‘์„ ์ „ํ˜€ ์ƒ๊ฐํ•˜์ง€ ์•Š๋Š”๋‹ค.

์˜ˆ์™ธ์ฒ˜๋ฆฌ์‹œ์— ๋‹ค๋ฅธ ๊ฐ์ฒด์˜ ์‚ฌ๋ณธ์ด ์ „๋‹ฌ ๋œ๋‹ค๋Š” ์ ์€ ์˜ˆ์™ธ๊ฐ€ ๊ณ„์† ์ „๋‹ฌ(ํผ์ ธ๋‚˜๊ฐˆ๋•Œ,propagate)์—๋„ ํ•œ๊ฐ€์ง€์˜ ๊ณ ๋ ค์‚ฌํ•ญ์ด ๋ฐœ์ƒํ•œ๋‹ค. ๋‹ค์Œ์˜ ๋‘๊ฐ€์ง€์˜ catch ๋ธ”๋Ÿญ์€ ์ฐจ์ด์ ์ด ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ์™ธ๊ฒฌ์ƒ ๊ฐ™์€ ์—ญํ• ์„ ํ•œ๋‹ค.
~cpp 
    catch (Widget& w)
    {
        ...
        throw;              // ํ•ด๋‹น ๊ฐ์ฒด๋ฅผ ๋‹ค์‹œ ๋ณต์‚ฌํ•˜์ง€ ์•Š๊ณ  ๋˜์ง€๋ฉฐ, ํ•ด๋‹น ์˜ˆ์™ธ๋ฅผ propagete ํ•œ๋‹ค. 
    }
    catch (Widget& w)
    {
        ...
        throw w;            // ํ•ด๋‹น ๊ฐ์ฒด๋ฅผ ๋‹ค์‹œ ๋ณต์‚ฌํ•ด์„œ ๊ทธ ์‚ฌ๋ณธ์„ propagateํ•œ๋‹ค.
    }
์ฃผ์„์— ๋˜์–ด ์žˆ๋Š”๋ฐ๋กœ, ์ƒ๊ฐํ•ด ๋ณด๋ผ. throw๊ฐ€ ๋ณต์‚ฌ์ƒ์„ฑ์ž๋ฅผ ํ˜ธ์ถœํ•˜์ง€ ์•Š์•„์„œ ํšจ์œจ์ ์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ  throw๋Š” ์–ด๋– ํ•œ ํ˜•์ด๋“  ์˜ˆ์™ธ๋ฅผ ์ „๋‹ฌํ•œ๋Š”๋ฐ ์ƒ๊ด€ํ•˜์ง€ ์•Š๋Š”๋‹ค. ํ•˜์ง€๋งŒ, ์‚ฌ์‹ค ์˜ˆ์™ธ์ž์ฒด๊ฐ€ ๊ทธ ํ˜•์— ๋งž๊ฒŒ ๋˜์ ธ์ง€๋ฏ€๋กœ ๊ฑฑ์ •์ด ์—†๋‹ค. ํ•˜์ง€๋งŒ catch๋ฌธ์—์„œ ์˜ˆ์™ธ๋ฅผ ๋˜์ง€๋Š” ๊ฐ์ฒด์˜ ํ˜•ํƒœ๋ฅผ ๋ฐ”๊ฟ€ ํ•„์š”์„ฑ์ด ์žˆ์„๋•Œ ํ›„์ž๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ๊ฒ ๋‹ค.

์ž ๊ทธ๋Ÿผ ๋‹ค์Œ์˜ ์„ธ๊ฐ€์ง€ catch์— ๊ด€ํ•ด์„œ ์‹œํ—˜ํ•ด ๋ณด์ž. passAndThrowWidget์—์„œ ๋ฐœ์ƒํ•œ ์˜ˆ์™ธ๋Š” ๋‹ค์Œ์˜ ์„ธ๊ฐ€์ง€์˜ ๊ฒฝ์šฐ๋กœ ์žก์„์ˆ˜ ์žˆ๋Š”๊ฑธ ์˜ˆ์ƒํ• ์ˆ˜ ์žˆ๋‹ค.
~cpp 
catch (Widget w) ...        // ๊ฐ’์œผ๋กœ ์ „๋‹ฌ

catch (Widget& w) ...       // ์ฐธ์กฐ ์ „๋‹ฌ

catch (const Widget& w) ... // ์ƒ์ˆ˜ ์ฐธ์กฐ๋กœ ์ „๋‹ฌ
์ „๋‹ฌ๋œ ๊ฐ์ฒด๋Š” ๊ฐ„๋‹จํžˆ ์ฐธ์กฐ๋กœ ์žก์„์ˆ˜ ์žˆ๋‹ค;๊ทธ๊ฒƒ์€ ์ƒ์ˆ˜ ์ฐธ์กฐ๋กœ ์ „๋‹ฌ๋  ํ•„์š”์„ฑ์€ ์—†๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ƒ์ˆ˜ ์ฐธ์กฐ๊ฐ€ ์•„๋‹Œ ์ „๋‹ฌ ์ž„์‹œ ๊ฐ์ฒด๋“ค์€ ํ•จ์ˆ˜๋ฅผ ๋ถ€๋ฅด๋Š”๊ฑธ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.

๊ทธ๋Ÿผ ์ด๋“ค์˜ ์ฐจ์ด์ ์„ ์‚ดํŽด๋ณด๊ณ  ์˜ˆ์™ธ ๊ฐ์ฒด๋“ค์„ ๋ฆฌํ„ดํ•ด ๋ณด์ž.

~cpp 
    catch (Widget w) ...    // ๊ฐ’์œผ๋กœ ์ „๋‹ฌ
์ด๋ ‡๊ฒŒ ๊ฐ’์œผ๋กœ ์ „๋‹ฌํ•˜๋ฉด ๋‘๋ฒˆ์˜ ๋ณต์‚ฌ๊ฐ€ ์ผ์–ด๋‚˜๋Š”๊ฑธ ์˜ˆ์ƒํ• ์ˆ˜ ์žˆ๋‹ค. throw์‹œ ํ•œ๋ฒˆ catch์‹œ ํ•œ๋ฒˆ ok? ๋น„ํšจ์œจ์ด๋‹ค.

์ฐธ์กฐ๋กœ ์ „๋‹ฌํ• ๋•Œ ์˜ˆ์ƒํ•ด ๋ณด์ž
~cpp 
    catch (Widget& w) ...           // ์ฐธ์กฐ ์ „๋‹ฌ.
    catch (const Widget& w) ...     // ์ƒ์ˆ˜-์ฐธ์กฐ ์ „๋‹ฌ
์šฐ๋ฆฌ๋Š” ์ง€๊ธˆ๊นŒ์ง€ ๋ณต์‚ฌ์— ์˜ํ•œ ์ง€๋ถˆ์„ ์ƒ๊ฐํ• ์ˆ˜ ์žˆ๋Š”๋ฐ ์ฐธ์กฐ์˜ ์ „๋‹ฌ์€ ๋ฐ˜๋Œ€๋กœ ๋ณต์‚ฌํ•˜๋Š” ์ž‘์—…์ด ์—†๋‹ค. ์ฆ‰, ํ•œ๋ฒˆ์˜ ๋ณต์‚ฌ ์ดํ›„ ๊ณ„์† ๊ฐ™์€ ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋Š” ์…ˆ์ด๋‹ค.

์šฐ๋ฆฐ ์•„์ง ํฌ์ธํ„ฐ ์ „๋‹ฌ์— ์˜ํ•œ ๊ฑธ ์˜๋…ผํ•˜์ง€ ์•Š์•˜๋‹ค. ํ•˜์ง€๋งŒ ํฌ์ธํ„ฐ๋ฅผ ์ด์šฉํ•ด ์˜ˆ์™ธ๋ฅผ ๋˜์ง€(์ „๋‹ฌ:throw)ํ•˜๋Š” ๊ฒƒ์€ ํ•จ์ˆ˜์ƒ์—์„œ ํฌ์ธํ„ฐ๋ฅผ ์ „๋‹ฌ(pass)ํ•˜๋Š” ๊ฒƒ๊ณผ๋Š” ๋‹ค๋ฅธ๊ฑธ ์•Œ์ˆ˜ ์ž‡์„ ๊ฒƒ์ด๋‹ค. ์ฆ‰, ํฌ์ธํ„ฐ์˜ ๋ณต์‚ฌ๋ณธ์ด ์ด๋™ํ•˜๋Š”๋ฐ, ์ด๋ ‡๊ฒŒ ๋˜๋ฉด pointer๋ฅผ ์ „๋‹ฌํ•˜๋Š” ์ชฝ์˜ ์˜์—ญ์—์„œ throw์— ์˜ํ•ด ํŠ€์–ด ๋‚˜๊ฐ€๋ฉด ํฌ์ธํ„ฐ๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๋Š” ๊ฐ์ฒด๋Š” ์†Œ๋ฉธ๋˜๋ฏ€๋กœ ํฌ์ธํ„ฐ์— ์˜ํ•œ ์˜ˆ์™ธ ์ „๋‹ฌ(๋˜์ง€๋Š”๊ฒƒ:throw)๋Š” ํ”ผํ•ด์•ผ ํ•œ๋‹ค. (์ „์—ญ์˜ static ๊ฐ์ฒด์˜ ํฌ์ธํ„ฐ๋ผ๋ฉด ์ด์•ผ๊ธฐ๋Š” ๋‹ฌ๋ผ์ง„๋‹ค. ๋’ค์— ๋‹ค๋ฃฌ๋‹ค.)

์ž ๊ทธ๋Ÿผ ์˜ˆ์™ธ๋ฅผ ๋˜์งˆ๋•Œ์˜ ํ˜•์— ๊ด€ํ•œ ์ฃผ์˜๋ฅผ ์‚ดํŽด ๋ณด์ž. C++์˜ ์•”์‹œ์  ๋ณ€ํ™˜์— ์˜ํ•œ ๊ฒƒ์ด ๊ทธ ๋ฌธ์ œ์˜ ๋ฐœ๋‹จ์ธ๋ฐ, ์ฝ”๋“œ๋ฅผ ๋ณด์ž ํ‘œ์ค€ ์ˆ˜ํ•™ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ
~cpp 
    double sqrt(double);
๋ฅผ ์ด๋ ‡๊ฒŒ ์‚ฌ์šฉ ํ• ์ˆ˜ ์žˆ๋‹ค.
~cpp 
    int i;
    double sqrtOfi = sqrt(i);
Item 5์—๋„ ์–ธ๊ธ‰๋˜์–ด ์žˆ๋“ฏ์ด C++์ƒ์—์„œ์˜ ์•”์‹œ์  ๋ณ€ํ™˜์€ ๊ด‘ ๋ฒ”์œ„ํ•˜๋‹ค. iํ˜•์˜ double๋ณ€ํ™˜์€ ๊ฐ€๋ฟ? ํ•˜๋‹ค. ํ•˜์ง€๋งŒ ๋‹ค์Œ์„ ๋ณด์ž
~cpp 
    void f (int value)
    {
        try {
            if (someFunction() ) {      // someFunction()์ด ์ฐธ์ด๋ฉด intํ˜•์˜ ๋ณ€์ˆ˜๋ฅผ ์˜ˆ์™ธ๋กœ ๋˜์ง„๋‹ค.
                throw value;
            }
            ...
        }
        catch (double d) {      // ํ•ด๋‹น ํ•ธ๋“ค์€ double์ผ๋•Œ๋งŒ ์˜ˆ์™ธ๋ฅผ ์žก์„์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋Ÿผ value๋ฅผ ๋˜์ง€๋Š”
            ...                 // try์—์„œ์˜ ์˜ˆ์™ธ๋Š” ์ ˆ๋Œ€๋กœ ์žกํžˆ์ง€ ์•Š๋Š”๋‹ค. ์˜๋„ํ•œ ๋ฐ”๊ฐ€ ์•„๋‹ˆ๋ฆฌ๋ผ.
        }
        ...
    }
์ด๋Ÿฐ ์‚ฌํ•ญ์„ ์œ ์˜ ํ•ด์•ผ ํ•œ๋‹ค. ์˜ˆ์™ธ์—์„œ๋Š” ์•”์‹œ์  ๋ณ€ํ™˜์„ ์ƒ๊ฐํ•˜์ง€ ์•Š๋Š”๋‹ค.

๊ทธ๋Ÿผ ์˜ˆ์™ธ์˜ ๋ณ€ํ™˜์—๋Š” ํฌ๊ฒŒ ๋‘๊ฐ€์ง€์˜ ์ƒ๊ฐํ•  ์ ์ด ์žˆ๋Š”๋ฐ. ์ฒซ๋ฒˆ์งธ๊ฐ€ ์ƒ์† ๊ด€๊ณ„(์˜ˆ์™ธ ์ƒ์˜) ์ด๋‹ค. ์˜ˆ์™ธ์—์„œ๋Š” ํ•œ ์˜ˆ์™ธ ๊ฐ์ฒด์—์„œ ํŒŒ์ƒ๋œ ๋‹ค๋ฅธ ์˜ˆ์™ธ๊ฐ์ฒด๋“ค์„ ์žก๋Š”๊ฒƒ์ด ๊ฐ€๋Šฅํ•œ๋ฐ ์˜ˆ๋ฅผ๋“ค์–ด์„œ ํ‘œ์ค€ C++ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ์˜ ์˜ˆ์™ธ ์ƒ์†๋„๋Š” ์ด๋ ‡๊ฒŒ ๊ตฌ์„ฑ๋˜์—ˆ๋‹ค. (๋ชจ๋“  ์˜ˆ์™ธ๊ฐ€ ๋‚˜์™”๋Š”์ง€๋Š” ๋ชจ๋ฅด๊ฒ ๋‹ค.)
~cpp 
    exception 
        |
        +-logic_error
        |   |
        |   +-domain_error
        |   +-invalid_argument
        |   +-length_error
        |
        +-runtime_error
            |
            +-range_error
            +-underflow_error
            +-overflow_error

catch์—์„œ ๋ถ€๋ชจ ๊ฐ์ฒด๋กœ ์žก์œผ๋ฉด ์ž์‹ ๊ฐ์ฒด์˜ ์˜ˆ์™ธ๋“ค์ด ๋‹ค ์žกํžˆ๋Š” ์‹์ด๋‹ค .์˜ˆ๋ฅผ ๋“ค์ž๋ฉด
~cpp 
catch (runtime_error) ...           // ์ด๋ ‡๊ฒŒ ์„ ์–ธํ•˜๋ฉด runtime_error์ž์‹์ธ
catch (runtime_error&) ...          // range_error, underflow_error
catch (const runtime_error&) ...    // overflow_error์ด ๋‹ค ์žกํžˆ๋Š” ๊ฑฐ๋‹ค.


catch (runtime_error*) ...          // ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด runtime_error*
catch (const runtime_error*) ...    // range_error*, underflow_error*, overflow_error* ์œผ๋กœ ์žกํžˆ๋Š” ๊ฒƒ์ด๋‹ค.

๋‘๋ฒˆ์งธ์˜ ์ƒ๊ฐํ•  ์ ์€ ๋ชจ๋“  ์˜ˆ์™ธ๋ฅผ ์žก๊ณ  ์‹ถ์œผ๋ฉด
~cpp 
    catch (const void*) ...
์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์–ด๋– ํ•œ ํฌ์ธํ„ฐ type๋ผ๋„ ์žก์„ ๊ฒƒ์ด๋‹ค.

๋งˆ์ง€๋ง‰์œผ๋กœ ์ธ์ž ๋„˜๊ธฐ๊ธฐ์™€ ์˜ˆ์™ธ ์ „๋‹ฌ(๋˜์ง€๊ธฐ:throw)์˜ ๋‹ค๋ฅธ ์ ์€ catch ๊ตฌ๋ฌธ์€ ํ•ญ์ƒ catch๊ฐ€ ์“ฐ์—ฌ์ง„ ์ˆœ์„œ๋Œ€๋กœ (in the order of their appearance) ๊ตฌ๋™๋œ๋‹ค๋Š” ์ ์ด๋‹ค. (์˜์–ด ๊ตฌ๋ฌธ์„ ์ฐธ์กฐํ•˜์‹œ๊ธธ) ๋ง์ด ์ด์ƒํ•˜๋‹ค. ๊ทธ๋ƒฅ ๋‹ค์Œ ์˜ˆ์ œ๋ฅผ ๋ณด์ž

~cpp 
    try{
        ...
    }
    catch (logic_error& ex) {       // ์—ฌ๊ธฐ์—์„œ ๋ชจ๋“  logic์—๋Ÿฌ๊ฐ€ ์žกํžŒ๋‹ค.
        ...
    }
    catch (invalid_argument & ex){  // ์ด ๋ฌธ์€ ์ž‘๋™์„ ํ•˜์ง€ ์•Š๋Š”๋‹ค. ์œ„์˜ catch๊ตฌ๋ถ„์—์„œ ์ด๋ฏธ ์žก์•„ ๋ฒ„๋ฆฐ๋‹ค.
        ...
    }

๋ฐ˜๋Œ€๋กœ ๊ฐ€์ƒํ•จ์ˆ˜๋ฅผ ๋ถ€๋ฅผ๋•Œ ์ผ์–ด๋‚˜๋Š”์ผ์ด ์žˆ๋‹ค. ๋‹น์‹ ์ด ๊ฐ€์ƒํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ํ•จ์ˆ˜๋Š” ํ•ด๋‹น ๊ฐ์ฒด์˜ ๊ฐ€์žฅ ํ•ฉ๋‹นํ•œ ํ•จ์ˆ˜๋ฅผ dynamic์œผ๋กœ ์ฐพ์•„๋‚ธ๋‹ค. ์ด๊ฒƒ์€ ์ตœ๊ณ ๋กœ ์ ํ•ฉํ•œ ๊ฒƒ(best fit)์„ ์˜๋ฏธํ•˜์ง€ ๊ฐ€์žฅ ์ฒ˜์Œ์— ์ฐพ์•„ ์ง€๋Š” ๊ฒƒ(first fit)์„ ์˜๋ฏธํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋‹ค. ์œ„์˜ ์†Œ์Šค๋ฅผ ๋ฐ˜๋Œ€๋กœ ํ•œ๋‹ค๋ฉด

~cpp 
    try{
        ...
    }
    catch (invalid_argument & ex){  // invalid_argument ์˜ˆ์™ธ๋Š” ์ด๊ณณ์—์„œ ์žกํžŒ๋‹ค.
        ...
    }
    catch (logic_error& ex) {       // ์—ฌ๊ธฐ์„œ ๋ชจ๋“  ๋‹ค๋ฅธ logic_error ๊ด€๋ จ์€ ์ด๊ณณ์—์„œ ์žกํžŒ๋‹ค.
        ...
    }
์ด๋ ‡๊ฒŒ ๋Œ์•„๊ฐ€๋Š” ๊ฑฐ๋‹ค.

์ž์ž ์ •๋ฆฌ
  • ์ฒซ์งธ๋กœ ์˜ˆ์™ธ ๊ฐ์ฒด๋Š” ํ•ญ์ƒ ๋ณต์‚ฌ ๋œ๋‹ค.
  • ๋‘˜์งธ๋กœ ๋˜์ €์ง€๋Š” ๊ฐ์ฒด๋Š” ํ•จ์ˆ˜๋กœ ์ „๋‹ฌ๋ ๋•Œ ๋น„ํ•˜์—ฌ ํ˜•์— ๋Œ€ํ•œ ๋ณ€ํ™˜์ด ํ˜•์— ์˜ํ–ฅ ๋ฐ›๊ธฐ ์‰ฝ๋‹ค.
    ์˜ˆ์™ธ ๊ฐ์ฒด๋Š” ์ƒ์†์— ๊ทœ์น™์„ ๋”ฐ๋ฅธ๋‹ค. (์„ค๋ช…์„ ๋ณด์‹œ๊ธธ)
  • ์…‹์งธ๋กœ ์†Œ์Šค ์ฝ”๋“œ์— ๋‚˜ํƒ€๋‚˜๋Š” ์ˆœ์„œ๋Œ€๋กœ ์˜ˆ์™ธ๋Š” ์žกํžŒ๋‹ค.

1.5. Item 13: Catch exception by reference

  • Item 13: ์˜ˆ์™ธ๋Š” ์ฐธ์กฐ(reference)๋กœ ์žก์•„๋ผ.

catch ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ• ๋•Œ ํ•ด๋‹น ๊ตฌ๋ฌธ์„ ํ†ตํ•ด์„œ ์ „๋‹ฌ๋ฐ›์€ ์˜ˆ์™ธ ๊ฐ์ฒด๋“ค์„ ๋ฐ›๋Š” ๋ฐฉ๋ฒ•์„ ์ž˜์•Œ์•„์•ผ ํ•œ๋‹ค. ๋‹น์‹ ์€ ์„ธ๊ฐ€์ง€์˜ ์„ ํƒ์„ ํ• ์ˆ˜ ์žˆ๋‹ค. ๋ฐ”๋กœ ์ „ Item 12์—์„œ ์–ธ๊ธ‰ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ๊ฐ’(by value), ์ฐธ์กฐ(by reference), ํฌ์ธํ„ฐ(by pointer)์ด๋ ‡๊ฒŒ ์„ธ๊ฐ€์ง€ ์ •๋„๊ฐ€ ๋ ๊ฒƒ์ด๋‹ค.

์ž, ๋จผ์ € pointer(by pointer)์— ๊ด€ํ•œ ์ „๋‹ฌ์„ ์ƒ๊ฐํ•ด ๋ณด์ž. ์ด๋ก ์ ์œผ๋กœ ์ด ๋ฐฉ๋ฒ•์€ throw์œ„์น˜์—์„œ catch๊ตฌ๋ถ„์œผ๋กœ ์˜ˆ์™ธ๋ฅผ ํŠน๋ณ„ํ•œ ๋ณ€ํ™” ์—†์ด ๋А๋ฆฐ ํ”„๋กœ๊ทธ๋žจ ์ˆ˜ํ–‰ ์ƒํƒœ์—์„œ ์ „๋‹ฌํ•˜๊ธฐ์— ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์ด๋‹ค. ๊ทธ ์ด์œ ๋Š” ํฌ์ธํ„ฐ์˜ ์ „๋‹ฌ์€ ํ•ด๋‹น ์˜ˆ์™ธ ๊ฐ์ฒด๊ฐ€ ๋ณต์‚ฌ๋˜๋Š” ์ผ์—†์ด ํฌ์ธํ„ฐ ๊ฐ’๋งŒ ์ „๋‹ฌ๋˜๋Š” ๋ฐฉ๋ฒ•๋งŒ์„ ์ทจํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋ง์ด ์ข€ ์ด์ƒํ•œ๋ฐ ์˜ˆ์™ธ๋ฅผ ๋ณด๋ฉด์„œ ์„ค๋ช…ํ•œ๋‹ค.

Item 12์—์„œ ์–ธ๊ธ‰ํ•œ๊ฒƒ๊ณผ ๊ฐ™์ด ์˜ˆ์™ธ๋Š” ๋ณต์‚ฌ๋˜์–ด์„œ ์ „๋‹ฌ๋œ๋‹ค. ๊ทธ๊ฑธ ์ƒ๊ฐํ•ด๋ผ.
~cpp 
    class exception { ... };

    void someFunction()
    {
        static exception ex;        // ์ด๋ ‡๊ฒŒ ๋ฉ”๋ชจ๋ฆฌ์— ํ•ญ์ƒ ์กด์žฌํ•˜๋Š” ๊ฐ์ฒด๋งŒ์„ ์ „๋‹ฌํ• ์ˆ˜ ์žˆ๋‹ค.
        ...
        throw &ex;    // ํฌ์ธํ„ฐ๋กœ ์ „๋‹ฌ, ํ•ด๋‹น ํ•จ์ˆ˜ ์˜์—ญ์„ ๋ฒ—์–ด๋‚˜๋ฏ€๋กœ, static๋งŒ์ด ์‚ด์•„ ๋‚จ์„์ˆ˜ ์žˆ๋‹ค.
        ...
    }
    void doSomething()
    {
        try{
            someFunction();         // ์—ฌ๊ธฐ์—์„œ exception *์„ ๋˜์ง„๋‹ค.
        }
        catch ( exception *ex) {    // exception* ์„ ์žก๊ณ  ์•„๋ฌด๋Ÿฐ ๊ฐ์ฒด๋„ ๋ณต์‚ฌ๋˜์ง€ ์•Š๋Š”๋‹ค.
            ...
        }
    }

์ด ์ฝ”๋“œ๋Š” ๊นจ๋—ํ•˜๊ฒŒ ๋ณด์ด์ง€๋งŒ, ์ตœ์„ ์ฑ…์€ ์•„๋‹ˆ๋‹ค. ์ด๋Ÿฐ ์ผ์„ ์œ„ํ•ด์„œ ํ”„๋กœ๊ทธ๋ž˜๋จธ๋Š” ์˜ˆ์™ธ ๊ฐ์ฒด๋ฅผ ํ•ญ์ƒ ํ’ˆ๊ณ ์žˆ๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•ด์•ผ ํ• ๊ฒƒ์ด๋‹ค. ๊ฐ„๋‹จํžˆ ์ „์—ญ(Global) staitc์œผ๋กœ ์„ ์–ธํ•˜๋ฉด ๋œ๋‹ค๊ณ  ๋ฐ˜๋ฌธํ•˜๊ฒ ์ง€๋งŒ, ์ „์—ญ์˜ ์œ„ํ—˜์„ฑ์€ ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ๊ทธ๊ฑธ ์‰ฝ๊ฒŒ ๊นŒ๋จน์„์ˆ˜ ์žˆ๋‹ค๋Š”๋ฐ ์žˆ๋‹ค. ๋‹ค์Œ ์˜ˆ์ œ๋ฅผ ๋ณด๋ฉด
~cpp 
void someFunction()
{
    exception ex;       // local ์˜ˆ์™ธ ๊ฐ์ฒด์ธ๋ฐ ์ด ํ•จ์ˆ˜์˜ ์˜์—ญ์„ ๋ฒ—์–ด๋‚˜๋ฉด ํŒŒ๊ดด๋˜์–ด ์ง„๋‹ค.

    ...
    throw &ex;          // ๊ทธ๋Ÿผ ์ด๊ฑด ๋ง์งฑ ํ—›์ผ์ด๋ผ๋Š” ์†Œ๋ฆฌ ์ด๋ฏธ ํŒŒ๊ดด๋œ ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ์œผ๋‹ˆ
    ...
}
์ž ์ด๊ฑด ๋‚˜์œ ์ฝ”๋“œ์˜ ์œ ํ˜•์ผ ๊ฒƒ์ด๋‹ค. ์ฃผ์„์—์„œ ์–ธ๊ธ‰ํ•œ๊ฒƒ๊ณผ ๊ฐ™์ด ํ•จ์ˆ˜์—์„œ ๋ฒ—์–ด๋‚˜๋ฉด new๋‚˜ static์ด ์•„๋‹Œ์ด์ƒ ๋งŒ๋“ค์–ด์ง„ ๊ฐ์ฒด๋Š” ํŒŒ๊ดด๋˜์–ด ์ง„๋‹ค. ๊ทธ๋ฆฌ๊ณ  catch์—์„œ๋Š” ํŒŒ๊ดด๋˜์–ด์ง„ ๊ฐ์ฒด์˜ ์ฃผ์†Œ ๊ฐ’์„ ๋ฐ›๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

ํ•ด๋‹น ์ฝ”๋“œ๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด new heap object๋กœ ๋Œ€์ฒดํ• ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค.
~cpp 
    void someFunction() 
    {
        ...
        throw new exception;    // ์ด๊ฒƒ๋„ ์–ดํ๊ฐ€ ์žˆ๋Š”๊ฒŒ, new์—์„œ ์˜ˆ์™ธ ๋ฐœ์ƒํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ํ• ๊ฒƒ๊ฐ€?
        ...
    }

์ด๊ฒƒ๋„ ํ”ผํ•ด์•ผ ํ•  ๋ฐฉ๋ฒ•์ด๋‹ค. ์™œ๋ƒํ•˜๋ฉด I-just-caught-a-pointer-to-a-destoyed-object ๋ฌธ์ œ ๋•Œ๋ฌธ์ด๋‹ค. ๊ฒŒ๋‹ค๊ฐ€ catch๊ตฌ๋ฌธ์—์„œ ์ง๋ฉดํ•œ ๋˜ํ•˜๋‚˜์˜ ๋ฌธ์ œ๋Š” ๋Œ€์ฒด ์ด ํฌ์ธํ„ฐ๋ฅผ ๋ˆ„๊ฐ€ ์–ด๋””์„œ ์ง€์šฐ๋А๋ƒ ์ด๋‹ค. ๋‹ค๋ฅธ ๋ฉด์œผ๋กœ ์ƒ๊ฐํ•ด๋ณผ ๋ฌธ์ œ๋Š” ์˜ˆ์™ธ ๊ฐ์ฒด๊ฐ€ heap์ƒ์— ๋ฐฐ์น˜๋œ๋‹ค๋ฉด ์ง€์›Œ ์ง€์ง€ ์•Š์€ ์˜ˆ์™ธ ๊ฐ์ฒด๋Š” ํ‹€์ž„์—†์ด resource leak๋ฅผ ๋ฐœ์ƒ ์‹œํ‚ฌ ๊ฒƒ์ด๋‹ค. ๋„ˆ๋ฌด ๋ป”ํ•œ ์ด์•ผ๊ธฐ ์ธ๊ฐ€. ๊ทธ๋ฆฌ๊ณ  ํ”„๋กœ๊ทธ๋žจ์˜ ํ–‰๋ณด๊ฐ€ ์–ด๋–ป๊ฒŒ ๋ ์ง€ ์˜ˆ์ธก ํ• ์ˆ˜๋„ ์—†๋‹ค. ์•ˆ๊ทธ๋Ÿฐ๊ฐ€?

๋ช‡๋ช‡ ํด๋ผ์ด์–ธํŠธ๋Š” ์ „์—ญ(global)์ด๋‚˜ ์ •์  ๊ฐ์ฒด๋ฅผ(static object)์˜ ์ฃผ์†Œ๋ฅผ ๋„˜๊ธฐ์ž๊ณ  ๋งํ•˜๊ณ , ๋ช‡๋ช‡์€ heap์ƒ์˜ ์˜ˆ์™ธ ๊ฐ์ฒด์˜ ์ฃผ์†Œ๋ฅผ ์ „๋‹ฌํ•˜์ž๊ณ  ๋งํ•œ๋‹ค. ์ด์ฒ˜๋Ÿผ ํฌ์ธํ„ฐ๋ฅผ ํ†ตํ•œ ์˜ˆ์™ธ์˜ ์ „๋‹ฌ์€ (Catch by pointer) ์•„๋ฆฌ์†กํ•œ ๋ฌธ์ œ๋ฅผ ๋ฐœ์ƒ ์‹œํ‚จ๋‹ค. ์ง€์›Œ ์กŒ๋Š”๊ฐ€? ์•ˆ์ง€์›Œ ์กŒ๋Š”๊ฐ€? ํ•ญ์ƒ ๋Œ€๋‹ต์€ ํ™•์‹คํ•˜์ง€ ์•Š๋‹ค.

๊ฒŒ๋‹ค๊ฐ€ catch-by-pointer(ํฌ์ธํ„ฐ๋ฅผ ํ†ตํ•œ ์˜ˆ์™ธ ์ „๋‹ฌ)์€ ์–ธ์–ด์ƒ์—์„œ ์‚ฌ๋žŒ๋“ค์˜ ๋Œ€๋ฆฝ์„ ์œ ๋„ ํ•œ๋‹ค. ๋„ค๊ฐ€์ง€์˜ ํ‘œ์ค€ ์˜ˆ์™ธ ๊ฐ์ฒด๋“ค๋“ค( bad_alloc(Item 8:operator new์—์„œ ๋ถˆ์ถฉ๋ถ„ํ•œ ๋ฉ”๋ชจ๋ฆฌ ๋ฐ˜ํ™˜), bad_cast(Item 2:dynamic_cast์—์„œ ์ฐธ์กฐ ์‹คํŒจ), bad_typeid(dynamic_cast์ผ๋•Œ nullํฌ์ธํ„ฐ๋กœ ๋ณ€ํ™˜), bad_exception(Item 14:์˜ˆ์ธก ๋ชปํ•˜๋Š” ์˜ˆ์™ธ๋กœ ๋น ์ง€๋Š” ๊ฒƒ unexpected exception ๋ฌธ์ œ) ๊ฐ€ ์˜ˆ์™ธ ๊ฐ์ฒด๋“ค์˜ ๋ชจ๋“  ๊ฒƒ์ธ๋ฐ, ์ด๋“ค์„ ํ–ฅํ•œ ๊ธฐ๋ณธ์ ์ธ ํฌ์ธํ„ฐ๋Š” ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค. ๊ทธ๋ž˜์„œ ๋‹น์‹ ์€ ์˜ˆ์™ธ๋ฅผ ๊ฐ’์œผ๋กœ(by value)ํ˜น์€ ์ฐธ์กฐ๋กœ(by reference) ๋ฐ–์—๋Š” ๋Œ€์•ˆ์ด ์—†๋‹ค.

Catch-by-value๋Š” ํ‘œ์ค€ ์˜ˆ์™ธ ๊ฐ์ฒด๋“ค ์ƒ์—์—์„œ ์˜ˆ์™ธ ๊ฐ์ฒด์˜ ์‚ญ์ œ ๋ฌธ์ œ์— ๊ด€ํ•ด์„œ ๊ณ ๋ฏผํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค. ํ•˜์ง€๋งŒ ์˜ˆ์™ธ๊ฐ€ ์ „๋‹ฌ๋ ๋•Œ ๋‘๋ฒˆ์˜ ๋ณต์‚ฌ๊ฐ€ ์ด๋ฃจ์–ด ์ง„๋‹ค๋Š”๊ฒŒ ๋ฌธ์ œ๋‹ค. (Item 12์ฐธ๊ณ ) ๊ฒŒ๋‹ค๊ฐ€ ๊ฐ’์œผ๋กœ์˜ ์ „๋‹ฌ์€ slicing problem์ด๋ผ๋Š” ๋ฌธ์ œ๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค. ์ด๊ฒŒ ๋ญ๋ƒ ํ•˜๋ฉด, ๋งŒ์•ฝ ํ‘œ์ค€ ์˜ˆ์™ธ ๊ฐ์ฒด์—์„œ ์œ ๋„(์ƒ์†)ํ•ด์„œ ๋งŒ๋“ค์–ด์ง„ ์˜ˆ์™ธ ๊ฐ์ฒด๋“ค์ด ํ•ด๋‹น ๊ฐ์ฒด์˜ ๋ถ€๋ชจ๋กœ ๋˜์ € ์ง„๋‹ค๋ฉด, ๋ถ€๋ชจ ํŒŒํŠธ ๋ถ€๋ถ„๋งŒ ๊ฐ’์œผ๋กœ ๋‘๋ฒˆ์งธ ๋ณต์‚ฌ์‹œ์— ๋ณต์‚ฌ๋˜์–ด์„œ ์ „๋‹ฌ๋˜์–ด ๋ฒ„๋ฆฐ๋‹ค๋Š” ๋ฌธ์ œ๋‹ค. ์ฆ‰ ์ž˜๋ผ๋ฒ„๋ฆฌ๋Š” ๋ฌธ์ œ "slice off" ๋ผ๋Š” ํ‘œํ˜„์ด ๋“ค์–ด ๊ฐˆ๋งŒ ํ•˜๊ฒ ์ง€. ๊ทธ๋“ค์˜ data member๋Š” ์•„๋งˆ ๋ถ€์กฑํ•จ์ด ์ƒ๊ฒจ ๋ฒ„๋ฆด ๊ฒƒ์ด๊ณ  ํ•ด๋‹น ๊ฐ์ฒด์ƒ์—์„œ ๊ฐ€์ƒ ํ•จ์ˆ˜๋ฅผ ๋ถ€๋ฅผ๋•Œ ์—ญ์‹œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ด ๋ฒ„๋ฆด ๊ฒƒ์ด๋‹ค. ์•„๋งˆ ๋ฌด์กฐ๊ฑด ๋ถ€๋ชจ ๊ฐ์ฒด์˜ ๊ฐ€์ƒ ํ•จ์ˆ˜๋ฅผ ๋ถ€๋ฅด๊ฒŒ ๋  ๊ฒƒ์ด๋‹ค.(์ด ๊ฐ™์€ ๋ฌธ์ œ๋Š” ํ•จ์ˆ˜์— ๊ฐ์ฒด๋ฅผ ๊ฐ’์œผ๋กœ ๋„˜๊ธธ๋•Œ๋„ ๋˜‘๊ฐ™์ด ์ œ๊ธฐ ๋œ๋‹ค.) ์˜ˆ๋ฅผ ๋“ค์–ด์„œ ๋‹ค์Œ์„ ์ƒ๊ฐํ•ด ๋ณด์ž
~cpp 
    class exception {
    public:
        virtual const char * what() throw();
        ...
    }

    class runtime_error:public exception{ ... };

    class Validation_error : public runtime_error{      // ์ž ํ•ด๋‹น ๊ฐ์ฒด๋Š” runtime_error๋ฅผ ์ƒ์†ํ•ด์„œ ๋งŒ๋“ค์—ˆ๊ณ 
    public:             
        virtual const char * what() throw();            // ์ด ๊ฐ€์ƒํ•จ์ˆ˜๋Š” exception์ƒ์— ์žˆ๋Š” ๊ฒƒ์ด๋‹ค.
        ...
    }
    void someFunction()
    {
        ...
        if ( a validation ํ…Œ์ŠคํŠธ ์‹คํŒจ){
            throw Validation_error();
        }
        ...
    }
    void doSomething()
    {
        try{
            someFunction();
        }
        catch (exception ex) {      // item 12์—์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ exception์˜ ์ž์‹ ์˜ˆ์™ธ๊ฐ์ฒด๋“ค์€ ๋‹ค ์žกํžŒ๋‹ค.
            cerr << ex.what();      // ๊ฐ’์œผ๋กœ ๋ถ€๋ชจ๋งŒ ๋ณต์‚ฌํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— what() ๊ฐ€์ƒํ•จ์ˆ˜๋Š” exception์ƒ์˜ 
                                    // ๊ฐ€์ƒ ํ•จ์ˆ˜๊ฐ€ ๋ถˆ๋ฆฐ๋‹ค. ๊ฐœ๋ฐœ์ž์˜ ์˜๋„๋Š” Validation_error ์ƒ์˜ ๊ฐ€์ƒํ•จ์ˆ˜๋ฅผ
                                    // ๋ถ€๋ฅด๊ธธ ์›ํ•˜๋Š” ๊ฒƒ ์ด์—ˆ๋‹ค.
            ...
        }
    }
์ฃผ์„์— ์–ธ๊ธ‰๋˜์–ด ์žˆ๋“ฏ์ด ์ด ๋ฒ„์ „์€ slicing ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. ๊ตฌ์ฐจํ•œ ์„ค๋ช… ๊ท€์ฐฎ๋‹ค. ๊ฒฐ๋ก ์€ ๊ฐ’์œผ๋กœ(by value)์˜ ์˜ˆ์™ธ ๊ฐ์ฒด ์ „๋‹ฌ์€ ์ด๋Ÿฐ slicing ๋ฌธ์ œ๋กœ ๋‹น์‹ ์ด ์›ํ•˜๋Š” ํ–‰๋™์„ ์ ˆ๋Œ€๋กœ ๋ชปํ•œ๋‹ค.

์ž์ž ๊ทธ๋Ÿผ ๋‚จ์€๊ฑด ์˜ค์ง catch-by-reference(์ฐธ์กฐ๋กœ์„œ ์˜ˆ์™ธ ์ „๋‹ฌ)์ด๋‹ค. catch-by-reference๋Š” ์ด์ œ๊นŒ์ง€์˜ ๋…ผ์˜๋ฅผ ๊นจ๋—์ด ์—†์•  ์ค€๋‹ค. catch-by-pointer์˜ ๊ฐ์ฒด ์‚ญ์ œ ๋ฌธ์ œ์™€ ํ‘œ์ค€ ์˜ˆ์™ธ ํƒ€์ž…๋“ค์„ ์žก๋Š”๊ฑฐ์— ๋Œ€ํ•œ ์–ด๋ ค์›€, catch-by-value์™€ ๊ฐ™์€ slicing ๋ฌธ์ œ๋‚˜ ๋‘๋ฒˆ ๋ณต์ œ๋˜๋Š” ์–ด๋ ค์›€์ด ์—†๋‹ค. ์ฐธ์กฐ๋กœ์„œ ์˜ˆ์™ธ ์ „๋‹ฌ์—์„œ ์˜ˆ์™ธ ๊ฐ์ฒด๋Š” ์˜ค์ง ํ•œ๋ฒˆ ๋ณต์‚ฌ๋˜์–ด ์งˆ ๋ฟ์ด๋‹ค.

๋‹ค์Œ ์˜ˆ์ œ๋ฅผ ๋ณด์ž.
~cpp 
void someFunction()
{
    ...
    if ( validation ํ…Œ์ŠคํŠธ ์—๋Ÿฌ ){
        throw Validataion_error();
    }
    ...
}

void doSomething()
{
    try{
        someFunction();
    }
    catch (exception& ex){      // ์ด๋ถ€๋ถ„์„ ์ฐธ์กฐ๋กœ๋งŒ ๋ฐ”๊พธ์—ˆ๋‹ค. ์ด์ „์˜ ์˜ˆ์ œ์™€ ํŠน๋ณ„ํžˆ ๋ฐ”๋€๊ฒŒ ์—†๋‹ค.
                                // ํ•˜์ง€๋งŒ ์ด๋ถ€๋ถ„์ด ๋ฐ”๋€Œ์–ด์„œ
        cerr << ex.what();      // ์—ฌ๊ธฐ์„œ์˜ ๊ฐ€์ƒ ํ•จ์ˆ˜๋„ Validation_error์˜ ๋ฉ”์†Œ๋“œ๊ฐ€ ๋ถˆ๋ฆฐ๋‹ค.
        ...
    }
}

ํ•ด๋‹น ์†Œ์Šค๋Š” catch์—์„œ ์ฐธ์กฐ๋กœ๋งŒ์ด ๋ฐ”๋€Œ์—ˆ๋‹ค. &ํ•˜๋‚˜๋งŒ์ด ์ถ”๊ฐ€๋˜์–ด ์ง€๊ธˆ๊นŒ์ง€ ์ œ๊ธฐ๋œ ๋ฌธ์ œ๊ฐ€ ์‚ฌ๋ผ์ ธ ๋ฒ„๋ฆฐ๋‹ค.

catch-by-reference๋Š” ์ด์ œ๊นŒ์ง€์˜ ๋ฌธ์ œ์— ๋ชจ๋“  ํ•ด๊ฒฐ์ฑ…์„ ์ œ์‹œํ•œ๋‹ค. (slicing, delete๋ฌธ์ œ etc)๊ทธ๋Ÿผ ์ด์ œ ๊ฒฐ๋ก ์€ ํ•˜๋‚˜ ์•„๋‹๊นŒ?

Catch exception by reference!

1.6. Item 14: Use exception specifications judiciously.

  • Item 14: ์˜ˆ์™ธ๋ฅผ ์‹ ์ค‘ํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๋ผ.
(judiciously- ์‹ ์ค‘ํ•œ)

์ผ๋‹จ ์ด ์ฃผ์ œ๋ฅผ ๋ถ€์ •ํ•˜๋Š” ์ด๋Š” ์—†์œผ๋ฆฌ๋ผ.:์˜ˆ์™ธ๋Š” ์ ์ ˆํ•œ ๊ณณ์— ํ‘œํ˜„๋˜์–ด์•ผ ํ•œ๋‹ค. ๊ทธ๋“ค์€ ์ฝ”๋“œ๋ฅผ ๋” ์ดํ•ด๊ฐ€๊ธฐ ํŽธํ•˜๊ฒŒ ๋งŒ๋“ค์–ด ์ค€๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์•„๋งˆ ๋ช…์‹œ์ ์œผ๋กœ ํ‘œํ˜„๋œ ์˜ˆ์™ธ ์ƒํƒœ๊ฐ€ ์ „๋‹ฌ(๋˜์ €:throw-์ดํ•˜ ๋˜์ง„๋‹ค๋Š” ํ‘œํ˜„์œผ๋กœ) ๋  ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๊ทธ๋ ‡์ง€๋งŒ ์˜ˆ์™ธ๋Š” ์ฃผ์„(comment)๋ณด๋‹ค๋Š” ๋ชจํ˜ธํ•˜๋‹ค. ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๋•Œ๋•Œ๋กœ ์ปดํŒŒ์ผ์ค‘์— ์ •ํ™•ํžˆ ์ผ์น˜ํ•˜์ง€ ์•Š์€ ์˜ˆ์™ธ๋“ค์„ ๋ฐœ๊ฒฌํ• ์ˆ˜๋„ ์žˆ์œผ๋ฉฐ, ๋งŒ์•ฝ ํ•จ์ˆ˜๊ฐ€ ์˜ˆ์™ธ ์ŠคํŽ™(๋ช…์„ธ:์ดํ•˜๋ช…์„ธ)์ƒ์— ์ œ๋Œ€๋กœ ๋ช…๊ธฐ๋˜์ง€ ์•Š์€ ์˜ˆ์™ธ๋ฅผ ์ „๋‹ฌ(๋˜์กŒ)๋‹ค๋ฉด ์ž˜๋ชป์€ ์‹คํ–‰์‹œ๊ฐ„(runtime)์— ๋ฐœ๊ฒฌ๋œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํŠน๋ณ„ํ•œ ํ•จ์ˆ˜์ธ unexpected๋Š” ์ž๋™์œผ๋กœ ๋ถˆ๋ฆฌ๊ฒŒ ๋œ๋‹ค. ์ด๋ ‡๋“  ์˜ˆ์™ธ์ฒ˜๋ฆฌ๋Š” ์ƒ๋‹นํžˆ ๋งค๋ ฅ์ ์ธ ๋ฉด์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

  • ํ•˜์ง€๋งŒ ๋ณดํ†ต ์•„๋ฆ„๋‹ค์›€์€ ํ‘œ๋ฉด์ด ์•„๋‹Œ ๋‚ด๋ฉด์— ์กด์žฌํ•œ๋‹ค.
unexpected์— ๊ด€๋ จํ•œ ๊ธฐ๋ณธ์ ์ธ ํ–‰๋™์€ terminate๋ฅผ ํ˜ธ์ถœํ•ด์„œ terminate๋‚ด์—์„œ abort๋ฅผ ํ˜ธ์ถœ๋กœ ๊ฐ•์ œ๋กœ ํ”„๊ทธ๋žจ์„ ๋ฉˆ์ถ”๊ฒŒ ํ•œ๋‹ค. ์ด ์˜๋ฏธ๋Š” ๋ฐ”๋กœ abort๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ข…๋ฃŒํ• ๋•Œ ๊นจ๋—์ด ์ง€์šฐ๋Š” ๊ณผ์ •์„ ์ƒ๋žตํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ™œ์„ฑํ™”๋œ ์Šคํƒ ํ”„๋ ˆ์ž„๋‚ด์˜ ์ง€์—ญ ๋ณ€์ˆ˜๋Š” ํŒŒ๊ดด๋˜์ง€ ์•Š๋Š”๋‹ค.(์ฆ‰, ํ”„๋กœ๊ทธ๋žจ์ด ๋ฉˆ์ถ”๊ณ  ๋””๋ฒ„๊ทธ์‹œ ๊ทธ ์ƒํ™ฉ์— ํ˜„์žฌ์˜ ์ž๋ฃŒ ๊ฐ’์„ ์กฐ์‚ฌํ• ์ˆ˜ ์žˆ๋‹ค๋Š” ์˜๋ฏธ). ๊ทธ๋ž˜์„œ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ์˜ ๋ช…์„ธ์„ ์–ด๊ธด ๋ฌธ์ œ๋Š” ์ƒ๋‹นํžˆ ์‹ฌ๊ฐํ•œ ์ƒํ™ฉ์ด๋‚˜, ๊ฑฐ์˜ ๋ฐœ์ƒํ•˜์ง€ ์•Š์€ ์ƒํ™ฉ์ด๋‹ค. ๋ถˆํ–‰ํžˆ๋„ ๊ทธ๋Ÿฐ ์‹ฌ๊ฐํ•œ ์ƒํ™ฉ์„ ์ด๋ฅด๊ฒŒ ํ•˜๋Š” ํ•จ์ˆ˜ ์ž‘์„ฑ์ด ์šฉ์ดํ•˜๋‹ค๋Š”๊ฒŒ ๋ฌธ์ œ์ด๋‹ค. ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์˜ค์ง ์˜ˆ์™ธ ๋ช…์„ธ์— ์ž…๊ฐํ•œ๋Œ€๋กœ ๋ถ€๋ถ„์ ์œผ๋กœ ์˜ˆ์™ธ ์‚ฌ์šฉ์— ๊ด€ํ•œ ๊ฒ€์‚ฌ๋ฅผ ํ•œ๋‹ค. ์˜ˆ์™ธ๊ฐ€ ์žก์„์ˆ˜ ์—†๋Š”๊ฒƒ-์–ธ์–ด ํ‘œ์ค€ ์ƒ์—์„œ ๊ฑฐ๋ถ€ํ•˜๋Š”(๋น„๋ก ์ฃผ์˜(wanning)์ผ์ง€๋ผ๋„) ๊ธˆ์ง€ํ•˜๋Š” ๊ฒƒ- ์€ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ• ๋•Œ ์˜ˆ์™ธ ๋ช…์„ธ์—์„œ ๋ฒ—์–ด๋‚˜๋Š” ํ•จ์ˆ˜์ผ๊ฒƒ์ด๋‹ค.

๋‹ค์Œ์˜ f1ํ•จ์ˆ˜์— ๊ฐ™์ด ์•„๋ฌด๋Ÿฐ ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ ์•ˆ์‹œํ‚ค๋Š” ํ•จ์ˆ˜์— ๊ด€ํ•ด์„œ ์ƒ๊ฐํ•ด ๋ณด์ž. ์ €๋Ÿฐ ํ•จ์ˆ˜๋Š” ์•„๋งˆ ์–ด๋– ํ•œ ์˜ˆ์™ธ๋ผ๋„ ๋ฐœ์ƒ์‹œํ‚ฌ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค.
~cpp 
    extern void f1();
์ž ๊ทธ๋Ÿผ ์˜ˆ์™ธ ๋ช…์„ธ์ด ์ ์šฉ๋œ f2๋ฅผ ๋ณด์ž. ๋‹ค์Œ์€ ์˜ค์ง int๋งŒ์„ ์˜ˆ์™ธ๋กœ ๋˜์งˆ๊ฒƒ์ด๋‹ค.
~cpp 
    void f2() throw(int);
f1์ด f2์˜ ํ•จ์ˆ˜ ๋ช…์„ธ๊ณผ ๋‹ค๋ฅธ ์˜ˆ์™ธ๋ฅผ ๋˜์ง€๋”๋ผ๋„, C++์ƒ์—์„œ๋Š” f2์—์„œ f1๋ฅผ ๋ถ€๋ฅด๋Š”๊ฒƒ์„ ํ—ˆ์šฉํ•œ๋‹ค.
~cpp 
    void f2() throw(int)
    {
        ...
        f1();
        ...
    }
์ด๋Ÿฐ ์œ ์—ฐํ•œ ๊ฒฝ์šฐ๋Š” ๋งŒ์•ฝ ์˜ˆ์™ธ ๋ช…์„ธ์— ๊ด€ํ•œ ์ƒˆ๋กœ์šด ์ฝ”๋“œ๊ฐ€ ๊ณผ๊ฑฐ์˜ ์˜ˆ์™ธ ๋ช…์„ธ๊ฐ€ ๋ถ€์กฑํ•œ ์ฝ”๋“œ์™€ ์ž˜ ๊ฒฐํ•ฉํ• ์ˆ˜ ์žˆ์Œ์„ ๋ณด์ธ๋‹ค.

๋‹น์‹ ์˜ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๊ทœ์ •์— ๋งŒ์กฑํ•˜์ง€ ์•Š์€ ๋ฃจํ‹ด์„ ๊ฐ€์ง„ ํ•จ์ˆ˜์˜ ์ฝ”๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋Š”๋ฐ ๋ณ„ ๋ฌด๋ฆฌ์—†๋‹ค๊ณ , ๊ทธ๋Ÿฌํ•œ ํ˜ธ์ถœ์ด ์•„๋งˆ ๋‹น์‹ ์˜ ํ”„๋กœ๊ทธ๋žจ์—์„œ ํ”„๋กœ๊ทธ๋žจ์˜ ์ค‘์ง€๋ฅผ ์œ ๋„ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋‹น์‹ ์€ ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ๋งŒ๋“ค๋•Œ ์ตœ๋Œ€ํ•œ ๊ทธ๋Ÿฐ ๋งŒ์กฑ๋˜์ง€ ์•Š์€ ํ˜ธ์ถœ์„ ์ตœ์†Œํ™” ํ•˜๋„๋ก ๊ฒฐ๊ณผ๋ฅผ ์œ ๋„ํ•ด์•ผ ํ• ๊ฒƒ์ด๋‹ค. ์‹œ์ž‘์‹œ ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉํ–ฅ์€ ํ…œํ”Œ๋ฆฟ์ƒ์—์„œ์˜ ์˜ˆ์™ธ ์ŠคํŽ™๋ฅผ ์ตœ๋Œ€ํ•œ ํ”ผํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์ž ๋‹ค์Œ์˜ ์–ด๋– ํ•œ ์˜ˆ์™ธ๋„ ๋˜์ง€์ง€ ์•Š์€ ํ…œํ”Œ๋ฆฟ์„ ์ƒ๊ฐํ•ด ๋ณด์ž.
~cpp 
    template<class T>
    bool operator==(const T& lhs, const T& rhs) throw()
    {
        return &lhs == &rhs;
    }
์ด ํ…œํ”Œ๋ฆฟ์€ oprator== ํ•จ์ˆ˜๋ฅผ ๋ชจ๋“  ํ˜•์— ์ ์šฉ์‹œํ‚ค๋Š” ๊ฒƒ์ด๋‹ค. ์•„๋งˆ ๊ฐ™์€ ์ฃผ์†Œ์— ๊ฐ™์€ ํƒ€์ž…์ด๋ฉด true๋ฅผ ๋ฐ˜ํ™˜ํ•˜์ง€๋งŒ ์•„๋‹ˆ๋ผ๋ฉด ๊ทธ๊ฒƒ์€ false๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์ด๋Ÿฐ ํ…œํ”Œ๋ฆฟ์€ ์•„๋ฌด๋Ÿฐ ์˜ˆ์™ธ๋„ ๋˜์ง€์ง€ ์•Š์€ ํ…œํ”Œ๋ฆฟ์œผ๋กœ ๋ถ€ํ„ฐ ํ•จ์ˆ˜๊ฐ€ ๋งŒ๋“ค์–ด์ง€๋Š” ์ƒํƒœ์— ๋”ฐ๋ผ ์ ํ•ฉํ•œ ์˜ˆ์™ธ๊ฐ€ ํฌํ•จ๋œ๋‹ค. ํ•˜์ง€๋งŒ ๊ทธ๊ฒƒ์€ ๊ผญ ์‚ฌ์‹ค์ด ์•„๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด operator&(์ฃผ์†Œ ๋ฐ˜ํ™˜ operator)๊ฐ€๊ฐ€ ๊ผญ ๊ฐ™์€ ๋ช‡๋ช‡์˜ ํ˜•๋“ค์„ ์œ„ํ•ด์„œ overload๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋งŒ์•ฝ ์‚ฌ์‹ค์ด ๊ทธ๋Ÿฌํ•˜๋‹ค๋ฉด operaotr&๊ฐ€ operator== ์•ˆ์ชฝ์—์„œ ๋ถˆ๋ฆด๋•Œ ์˜ˆ์™ธ๋ฅผ ๋˜์งˆ ๊ฒƒ์ด๋‹ค. ๊ทธ๋ ‡๊ฒŒ ๋˜๋ฉด ์šฐ๋ฆฌ์˜ ์˜ˆ์™ธ ๋ช…์„ธ๋Š” ๊ฑฐ๋ถ€๋˜๊ณ , ๊ณง์žฅ unexpected ๋กœ ์ง์ง„ํ•˜๊ฒŒ ๋˜๋Š”๊ฑฐ๋‹ค.

์ด๋Ÿฌํ•œ ํŠน๋ณ„๋‚œ ์˜ˆ์ œ๋Š” ๋” ์ผ๋ฐ˜์ ์ธ ๋ฌธ์ œ๋กœ, ๋‹ค์‹œ ๋งํ•˜์ž๋ฉด ํ…œํ”Œ๋ฆฟ์˜ ํ˜• ์ธ์ž๋กœ ์ „๋‹ฌ๋˜๋Š” ์˜ˆ์™ธ์— ๊ด€ํ•œ ์ •๋ณด๋ฅผ ์•Œ์•„๋‚ผ ๊ธธ์ด ์—†๋‹ค๋Š” ์ ๋„ ํ•œ๋ชซ์ด๋‹ค. ์šฐ๋ฆฌ๋Š” ๊ฑฐ์˜ ํ…œํ”Œ๋ฆฟ์„ ์œ„ํ•œ ์˜๋ฏธ์žˆ๋Š” ์˜ˆ์™ธ ๋ช…์„ธ๋ฅผ ์ œ๊ณตํ• ์ˆ˜ ์—†๋‹ค๋Š” ์ด์•ผ๊ธฐ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ํ…œํ”Œ๋ฆฟ์€ ๊ฑฐ์˜ ๋ณ€ํ•จ์—†์ด ๊ทธ๋“ค์ด ํ˜• ์ธ์ž๋ฅผ ๋ช‡๊ฐ€์ง€์˜ ๋ฐฉ์‹์œผ๋กœ๋งŒ ์“ฐ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๊ฒฐ๋ก ์€? ํ…œํ”Œ๋ฆฟ๊ณผ ์˜ˆ์™ธ๋Š” ์–ด์šธ๋ฆฌ์ง€ ์•Š๋Š”๋‹ค.!

  • ๋‘๋ฒˆ์งธ๋กœ ๋‹น์‹ ์€ unexpectedํ˜ธ์ถœ์„ ๋ง‰๊ธฐ์œ„ํ•˜์—ฌ ๋ถ€์กฑํ•œ ์˜ˆ์™ธ ๋ช…์„ธ์˜ ๊ทœ์ •์œผ๋กœ ์ธํ•˜์—ฌ ๋ถˆ๋ฆฌ๋Š” ํ•จ์ˆ˜์ƒ์—์„œ ์˜ˆ์™ธ ๋ช…์„ธ๋ฅผ ์ƒ๋žตํ• ์ˆ˜ ์žˆ๋‹ค.
์ด๊ฒƒ์€ ๊ฐ„๋‹จํ•˜๊ณ  ์ผ๋ฐ˜์ ์ธ ์ƒ๊ฐ์ด์ง€๋งŒ, ์žƒ์–ด๋ฒ„๋ฆฌ๊ธฐ ์‰ฌ์šด ๊ฒฝ์šฐ์ด๋‹ค. ๋‹ค์Œ์˜ callback ํ•จ์ˆ˜ ๋“ฑ๋ก์— ๊ด€ํ•œ ์˜ˆ์ œ๋ฅผ ๋ณด์ž
~cpp 
typedef void (*CallBackPtr) (int eventXLocation, int event YLocation, void *dataToPassBack);

class CallBack{
public:
    CallBack(CallBackPtr fPtr, void *dataToPassBack) :func(fPtr), data(dataToPassBack){}

    void makeCallBack(int eventXLocation, int eventYLocation) const throw();
private:
    CallBackPtr func;
    void *data
}

    void CallBack::makeCallBack(int eventXLocation, int eventYLocation)
    {
        func(eventXLocation, eventYLocation);
    }
์ด ์ฝ”๋“œ์—์„œ makeCallBack์—์„œ func์„ ํ˜ธ์ถœํ•˜๋Š”๊ฒƒ์€ func์ด ๋˜์ง€๋Š” ์˜ˆ์™ธ์— ๊ฒƒ์„ ์•Œ๊ธธ์ด ์—†์–ด์„œ ์˜ˆ์™ธ ๋ช…์„ธ์— ์œ„๋ฐ˜ํ•˜๋Š” ์œ„ํ—˜ํ•œ ์ƒํ™ฉ์œผ๋กœ ๊ฐˆ์ˆ˜ ์žˆ๋‹ค.

์ด๋Ÿฐ ๋ฌธ์ œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด CallBackPtr์ƒ์˜ ์˜ˆ์™ธ ๋ช…์„ธ๋ฅผ ์ข€๋” ๊ตฌ์ฒดํ™” ์‹œ์ผœ์„œ ์ œ๊ฑฐํ• ์ˆ˜ ์žˆ๋‹ค.
~cpp 
typedef void (*CallBackPtr) (int eventXLocation, int event YLocation, void *dataToPassBack) throw();
๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ˜•์ด ์„ ์–ธ๋˜์—ˆ์œผ๋ฉด callbackํ•จ์ˆ˜ ๋“ฑ๋ก์‹œ ์•„๋ฌด๊ฒƒ๋„ ๋˜์ง€์ง€ ์•Š๋Š”๋‹ค๋Š” ์กฐ๊ฑด์ด๋ผ๋ฉด ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒํ• ๊ฒƒ์ด๋‹ค.
~cpp 
    // ์˜ˆ์™ธ ๋ช…์„ธ๊ฐ€ ์—†๋Š” ํ•จ์ˆ˜
    void callBackFcn1(int eventXLocation, int event YLocation, void *dataToPassBack);
    void *vallBackData;
    ...
    CallBack c1(callBackFcn1, callBackData); // ์—๋Ÿฌ๋‹ค callBackFcn1์€ ์—ฌ๊ธฐ์—์„œ ํ˜•์ด ๋งž์ง€ ์•Š์•„. ์—๋Ÿฌ๋ฅผ ๋˜์งˆ๊ฒƒ์ด๋‹ค.

    // ์˜ˆ์™ธ ๋ช…์„ธ๊ฐ€ ์žˆ๋Š” ํ•จ์ˆ˜
    void callBackFcn2(int eventXLocation, int event YLocation, void *dataToPassBack); throw()
    CallBack c1(callBackFcn2, callBackData); // ๋ณด๋‹ค์‹œํ”ผ ์•Œ๋งž๋Š” ํ˜•์ด๋‹ค.

์ด๋Ÿฌํ•œ ํ•จ์ˆ˜ ํฌ์ธํ„ฐ ์ „๋‹ฌ์‹œ ๊ด€๋ จ์€ ์ตœ๊ทผ์— ์ถ”๊ฐ€๋œ๊ฑฐ๋‹ˆ ๋งŒ์•ฝ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ง€์› ๋ชปํ•œ๋‹ค๊ณ  ํ•ด๋„ ๋†€๋ž„๊ฒƒ์€ ์—†๋‹ค. (์ด์ฑ…์€ 1996๋…„์— ๋‚˜์™”๋‹ค. ํ•˜์ง€๋งŒ ์ง€๊ธˆ๋„(2001๋…„์ •๋„) ์ œ๋Œ€๋กœ ์ง€์›ํ•˜๋Š” ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋งŽ์ง€ ์•Š์€๊ฑธ๋กœ ์•ˆ๋‹ค.) ๋งŒ์•ฝ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ฒ˜๋ฆฌ ๋ชปํ•œ๋‹ค๋ฉด ์ด๋Ÿฐ ์‹ค์ˆ˜์˜ ๋ฐฉ์ง€๋Š” ๋‹น์‹  ์ž์‹ ์—๊ฒŒ ๋‹ฌ๋ ธ๋‹ค.

  • ์„ธ๋ฒˆ์งธ๋กœ ๋‹น์‹ ์€ "the system"์ด ์•„๋งˆ ๋˜์ง€๋Š” ์˜ˆ์™ธ๋ฅผ ํ•ธ๋“ค๋งํ•ด์„œ unexcepted์˜ ํ˜ธ์ถœ์„ ํ”ผํ• ์ˆ˜ ์žˆ๋‹ค. ์ด๋Ÿฌํ•œ ์˜ˆ์™ธ๋Š” ๋งŽ์€ ๋ถ€๋ถ„์ด new์™€ new[]์‹œ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น ์˜ˆ์™ธ์—์„œ bad_alloc์ด ๋ฐœ์ƒํ•˜์—ฌ ๋ฐœ์ƒํ•œ๋‹ค. ๋งŒ์•ฝ ๋‹น์‹ ์ด new๋ฅผ ์–ด๋–ค ํ•จ์ˆ˜์—์„œ ์“ด๋‹ค๋ฉด ์šฐ์—ฐ์ด๋ผ๋„ bad_alloc ์˜ˆ์™ธ๋ฅผ ๋งŒ๋‚ ์ˆ˜ ์žˆ๋Š” ๊ฐ€๋Šฅ์„ฑ์„ ๋‚ดํฌํ•˜๋Š” ์…ˆ์ด๋‹ค.

์ž, ์ง€๊ธˆ 1์˜จ์Šค์˜ ์˜ˆ๋ฐฉ๋Š” ์ฐจํ›„ 1ํŒŒ์šด๋“œ์˜ ํ”ผํ•ด๋ณด๋‹ค ๋‚ณ์ง€๋งŒ ๋•Œ๋กœ๋Š” ์˜ˆ๋ฐฉ์ด ์–ด๋ ต๊ณ  ํ”ผํ•ด๊ฐ€ ๋” ์‰ฌ์šด ๊ฒฝ์šฐ๋„ ์žˆ์œผ๋ฆฌ๋ผ. ์–ธ๊ธ‰ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ๋•Œ๋•Œ๋กœ unexpected ์˜ˆ์™ธ ์ง์ ‘ ๋งž์„œ๋Š” ๊ฒƒ์€ ์ฒ˜์Œ์— ๊ทธ๊ฒƒ์„ ์—๋ฐฉํ•˜๋Š”๊ฒƒ ๋ณด๋‹ค ์‰ฝ๋‹ค. ์˜ˆ๋ฅผ๋“ค์ž๋ฉด ๋งŒ์•ฝ ๋‹น์‹ ์ด ์˜ˆ์™ธ๋ช…์„ธ๋ฅผ ์—„๊ฒฉํ•˜๊ฒŒ ์ž‘์„ฑํ–ˆ์ง€๋งŒ ๋‹น์‹ ์€ ์˜ˆ์™ธ ๋ช…์„ธ๊ฐ€ ๋˜์–ด ์žˆ์ง€ ์•Š์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ํ•จ์ˆ˜๋“ค์„ ๊ฐ•์ œ๋กœ ๋ถ€๋ฅผ์ˆ˜ ์žˆ๋‹ค. ํ•จ์ˆ˜์ƒ์—์„œ ์ฝ”๋“œ๋“ค์ด ๋ฐ”๋€Œ๋Š” ์ •์ด๋ผ์„œ unexpected์˜ˆ์™ธ๋ฅผ ๋ง‰๋Š”๊ฒƒ์€ ๋น„์‹ค์šฉ์ ์ด๋‹ค.

๋งŒ์•ฝ unexpected์˜ˆ์™ธ๋ฅผ ๋ง‰๋Š”๊ฒƒ์ด ์‹ค์šฉ์ ์ด์ง€ ๋ชปํ•˜๋‹ค๋ฉด ๋‹น์‹ ์€ C++๊ฐ€ unexpected๋ฅผ ๋‹ค๋ฅธ ํ˜•์‹์œผ๋กœ ๋ฐ”๊พธ์–ด ๋ฒ„๋ฆฌ๋Š” ๊ธฐ๋Šฅ์„ ์ด์šฉํ•ด์„œ ๊ทธ๋Ÿฌํ•œ ๋น„์‹ค์šฉ์ ์ธ ์ƒํƒœ๋ฅผ ๋งŒํšŒํ• ์ˆ˜ ์žˆ๋‹ค. ๋‹ค์Œ ์˜ˆ๋Š” unexpect์™€ ๊ฐ™์€ ์˜ˆ์™ธ๋ฅผ UnexpectedException ๊ฐ์ฒด๋กœ ๋ฐ”๊พผ๊ฒƒ์„ ์ƒ๊ฐํ•ด ๋ณธ๋‹ค.
~cpp 
class UnexpectedException {};

void convertUnexpected()
{
    throw UnexpectedException();
}

๊ทธ๋ฆฌ๊ณ  unexpected ํ•จ์ˆ˜๋ฅผ convertUnexpected๋กœ ๊ต์ฒดํ•œ๋‹ค.
~cpp 
    set_unexpected(convertUnexpected);
์ด๋ ‡๊ฒŒ ํ•˜๋ฉด unexpected์˜ˆ์™ธ๋Š” convertUnexpected๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค. ์ฆ‰, ์ƒˆ๋กœ์šด UnexpectedException ๊ฐ์ฒด๋กœ ์˜ˆ์™ธ๊ฐ€ ๊ต์ฒด๋˜์—ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ œ๊ณต๋˜๋Š” ์˜ˆ์™ธ ๋ช…์„ธ์—์„œ unexpected๋ฅผ ๋ฐฉ์ง€ํ• ๋ ค๋ฉด UnexpectedException ์˜ˆ์™ธ๋ฅผ ํฌํ•จํ•ด์•ผ ํ•œ๋‹ค. ์˜ˆ์™ธ๋ฅผ ๊ฐ์ฒด๋กœ ๋˜์กŒ๊ธฐ์—.. (๋งŒ์•ฝ ์˜ˆ์™ธ ๋ช…์„ธ์— UnexpectedException์„ ๋„ฃ์ง€ ์•Š์•˜๋‹ค๋ฉด unexpected๊ฐ€ ๊ต์ฒด๋˜์ง€ ์•Š์€ ๊ฒƒ์ฒ˜๋Ÿผ terminate๊ฐ€ ๋ถˆ๋ฆด๊ฒƒ์ด๋‹ค.)

๋˜ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์€ unexpected ์˜ˆ์™ธ๋ฅผ ๊ทธ๋ƒฅ unexpected์˜ ์—ญํ• ์„ ํ˜„์žฌ์˜ ์˜ˆ์™ธ๋ฅผ ๊ณ„์† ๋˜์ง€๊ธฐ(rethrow)ํ˜•ํƒœ๋กœ ๋ฐ”๊พธ์–ด ๋ฒ„๋ฆฌ๋Š” ๊ฒƒ์ด๋‹ค. ์ด๋ ‡๊ฒŒ ๊ต์ฒดํ•˜๋ฉด ์˜ˆ์™ธ๋Š” ์•„๋งˆ ์ƒˆ๋กœ์šด ํ‘œ์ค€์˜ bad_exception ์„ ๋˜์ง€๋Š” ํ˜•ํƒœ๋กœ ๋ฐ”๋€๋‹ค. (์ •๊ทœ C++๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ํฌํ•จ)
~cpp 
    void convertUnexpected()
    {
        throw()     // ์ด๊ฑด ํ˜„์ œ์˜ ์˜ˆ์™ธ๋ฅผ ๊ณ„์† ๋˜์ง„๋‹ค๋Š” ์˜๋ฏธ
    }

    set_unexpected(convertUnexpected);
๋งŒ์•ฝ ์œ„์™€ ๊ฐ™์ด ํ•˜๊ณ  bad_exception(ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ƒ์˜ exception์˜ ๊ธฐ๋ณธ ์˜ˆ์™ธ ํด๋ž˜์Šค)๋ฅผ ๋‹น์‹ ์˜ ๋ชจ๋“  ์˜ˆ์™ธ ๋ช…์„ธ์— ํฌํ•จ์‹œํ‚ค๋ฉด ๋‹น์‹ ์€ ๊ฒฐ์ฝ” ๋‹น์‹ ใ„ด์˜ ํ”„๋กœ๊ทธ๋žจ์ด ๋ถˆ์‹œ์— ๋ฉˆ์ถ”์–ด ๋ฒ„๋ฆฌ๋Š”๊ฒƒ์— ๋Œ€ํ•œ ๊ฑฑ์ •์„ ํ•  ์š”๋Š” ์—†์„ ๊ฒƒ์ด๋‹ค. ๊ฑฐ๊ธฐ๋‹ค๊ฐ€ ๊ทœ์ •์— ๋งž์ง€์•Š๋Š” ์˜ˆ์™ธ๋“ค๋„ bad_exception์œผ๋กœ ๊ต์ฒด๋˜๊ณ  ์˜ˆ์™ธ๋Š” ๊ธฐ๋ณธ ์˜ˆ์™ธ ๋Œ€์‹ ์— ๋‹ค์‹œ ๋˜์ € ํผ์ง„๋‹ค.(propagate)

--
์ด์ œ ๋‹น์‹ ์€ ์˜ˆ์™ธ ๋ช…์„ธ๊ฐ€ ๋งŽ์€ ๋ฌธ์ œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์„์ˆ˜ ์žˆ์Œ์„ ์ดํ•ด ํ• ๊ฒƒ์ด๋‹ค. ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๊ทธ๋“ค์˜ ๋ถ€๋ถ„์ ์ธ ์“ฐ์ž„์ƒˆ๋ฅผ ๊ฒ€์‚ฌํ•ด์„œ ํ…œํ”Œ๋ฆฟ์—์„œ ๋ฌธ์ œ๋ฅผ ๋ฐœ์ƒํ•  ์†Œ์ง€๋ฅผ ์•Š์œผ๋ฉฐ, ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์˜์™ธ๋กœ ๊ทœ์น™์œ„๋ฐ˜์„ ํ•˜๊ธฐ ์‰ฝ๊ณ , ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ œ๋Œ€๋กœ ๋˜์ง€ ์•Š์œผ๋ฉด ํ”„๋กœ๊ทธ๋žจ์„ ๋ถˆ์‹œ์— ๋ฉˆ์ถ”์–ด ์ง€๋„๋ก ์œ ๋„ํ• ๊ฒƒ์ด๋‹ค. ์˜ˆ์™ธ ๋ช…์„ธ ์—ญ์‹œ ๋˜๋‹ค๋ฅธ ๋ฌธ์ œ๋ฅผ ์•ˆ๊ณ  ์žˆ๋Š”๋ฐ, ์˜ˆ์™ธ๋ช…์„ธ๋Š” ๋†’์€ ์ˆ˜์ค€์˜ ํ˜ธ์ถœ์ž๊ฐ€ ์˜ˆ์™ธ ๋ฐœ์ƒ์„ ๋Œ€๋น„ํ• ๋•Œ๋„ unexpected๋กœ์˜ ๊ฒฐ๊ณผ๋ฌผ์„ ๋งŒ๋“ค์–ด ๋‚ธ๋‹ค.

์ด์•ผ๊ธฐ๋ฅผ ์œ„ํ•ด Item 11์˜ ์˜ˆ์ œ๋ฅผ ๊ทธ๋Œ€๋กœ ๋ณด์ž
~cpp 
    class Session{
    public:
        ~Session();
        ...
    private:
        static void logDestuction(Session *objAddr) throw();
    };

    Session::~Session()
    {
        try{
            logDestruction(this);
        }
        catch ( ... ) {}
    }
Session์˜ ํŒŒ๊ดด์ž๋Š” logDestruction์„ ํ˜ธ์ถœํ•œ๋‹ค. ํ•˜์ง€๋งŒ ๋ช…์‹œ์ž‘์€ ์–ด๋– ํ•œ ์˜ˆ์™ธ๋„ ํ•ด๋‹น logDestruction์—์„œ ๋˜์ง€์ง€ ๋ชปํ•˜๋„๋ก ๋ง‰์•„๋†“์•˜๋‹ค. ํ•œ๋ฒˆ logDestuction์ด ์‹คํŒจํ• ๋•Œ ๋ถˆ๋ฆฌ๋Š” ํ•จ์ˆ˜๋“ค์— ๋Œ€ํ•˜์—ฌ ์ƒ๊ฐํ•ด ๋ณด์ž. ์ด๊ฒƒ์€ ์•„๋งˆ ์ผ์–ด๋‚˜์ง€ ์•Š์„ ๊ฒƒ์ด๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ์ƒ๊ฐํ•œ๋Œ€๋กœ์ด๊ฑด ์ƒ๋‹นํžˆ ์˜ˆ์™ธ ๋ช…์„ธ์˜ ๊ทœ์ • ์œ„๋ฐ˜์œผ๋กœ ์ธ๋„ํ•˜๋Š” ์ฝ”๋“œ์ด๋‹ค. ์ด๋Ÿฐ ์˜ˆ์ธกํ• ์ˆ˜ ์—†๋Š” ์˜ˆ์™ธ๊ฐ€ logDestruction์œผ๋กœ ๋ถ€ํ„ฐ ํผ์งˆ๋•Œ unexpected๊ฐ€ ํ’€๋ฆด ๊ฒƒ์ด๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ทธ๊ฒƒ์€ ํ”„๋กœ๊ทธ๋žจ์„ ๋ฉˆ์ถ˜๋‹ค. ์ด ์˜ˆ์ œ๋Š” ๊ทธ๊ฒƒ์˜ ์ˆ˜์ • ๋ฒ„์ „์ด์ง€๋งŒ, ๊ทธ๋Ÿฐ ์ˆ˜ํ–‰์„ Session ํŒŒ๊ดด์ž์˜ ์ œ์ž‘์ž๊ฐ€ ์›ํ• ๊นŒ? ์ž‘์„ฑ์ž๋Š” ๋ชจ๋“  ๊ฐ€๋Šฅํ•œ ์˜ˆ์™ธ ๋ฅผ ์žก์œผ๋ ค๊ณ  ๋…ธ๋ ฅํ•œ๋‹ค. ๊ทธ๋ž˜์„œ ๊ทธ๊ฑด Session ํŒŒ๊ดด์ž์˜ catch๋ธ”๋Ÿญ์—์„œ์ˆ˜ํ–‰๋˜๋Š” ๊ฒƒ์ด ๋‹ค๋‹ค๋ฉด ๊ทธ๊ฑด ๋ถˆ๊ณตํ‰ํ•œ ์ฒ˜์‚ฌ๋ผ๊ณ  ๋ณด์ธ๋‹ค. ๋งŒ์•ฝ logDestruction์ด ์•„๋ฌด๋Ÿฐ ์˜ˆ์™ธ ๋ช…์„ธ๋ฅผ ํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด, I'm-willing-to-catch-it-if-you'll-just-give-me-a-chance ์‹œ๋‚˜๋ฆฌ์˜ค๋Š” ๊ฒฐ์ฝ” ์ผ์–ด๋‚˜์ง€ ์•Š์„๊ฒƒ์ด๋‹ค. (์ด๋Ÿฐ ๋ฌธ์ œ์˜ ์˜ˆ๋ฐฉ์œผ๋กœ unexpected์˜ ๊ต์ฒด์— ๋Œ€ํ•œ ์„ค๋ช…์„ ์œ„ํ•ด ์–ธ๊ธ‰ํ•ด ๋‘์—ˆ๋‹ค.)

์˜ˆ์™ธ ๋ช…์„ธ์˜ ๊ท ํ˜•์žˆ๋Š” ์‹œ๊ฐ์€ ์ค‘์š”ํ•œ๊ฒƒ์ด๋‹ค. ๊ทธ๊ฒƒ์€ ์˜ˆ์™ธ ๋ฐœ์ƒ์„ ์˜ˆ์ƒํ•˜๋Š” ํ•จ์ˆ˜๋“ค์˜ ์˜ˆ์™ธ ์ข…๋ฅ˜๋“ค์„ ๋ณด๋ฉด ํ›Œ๋ฅญํ•œ ๋ฌธ์„œํ™”๊ฐ€ ๋ ๊ฒƒ์ด๊ณ , ์ž˜๋ชป๋œ ์˜ˆ์™ธ ๋ช…์„ธ์˜ ์ƒํ™ฉํ•˜์˜ ํ”„๋กœ๊ทธ๋žจ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ฃผ์–ด์ง€๋Š” ์ƒํƒœ ์ฆ‰, ์ฆ‰์‹œ ๋ฉˆ์ถ”๋Š” ๊ฒƒ์„ ์ •๋‹นํ™”ํ•  ๋งŒํผ ์ž˜๋ชป๋œ ์ผ์ด๋‹ค. ๊ฐ™์€ ์‹œ๊ฐ์œผ๋กœ ์˜ˆ์™ธ๋Š” ์ปดํŒŒ์ผ๋Ÿฌ์— ์˜ํ•˜์—ฌ ์˜ค์ง ๋ถ€๋ถ„์ ์ธ ์ ๊ฒ€๋งŒ์„ ๋‹นํ•˜๊ณ  ์˜ˆ์™ธ๋Š” ์˜๋„ํ•˜์ง€ ์•Š์€ ์ž˜๋ชป์„ ์–‘์‚ฐํ•˜๊ธฐ ์‰ฌ์šธ๊ฒƒ์ด๋‹ค. ๊ฒŒ๋‹ค๊ฐ€ ์˜ˆ์™ธ๋Š” unexpected ์˜ˆ์™ธ์—์„œ ๋ฐœ์ƒํ•˜๋Š” ๋†’์€ ๋ ˆ๋ฒจ์˜ ์˜ˆ์™ธ ์žก๋Š” ๋ฌธ์ œ์— ๋Œ€ํ•˜์—ฌ ์˜ˆ๋ฐฉํ• ์ˆ˜ ์žˆ๋‹ค.

์ž ์ด๋Ÿฐ๊ฒƒ๋“ค์ด ์˜ˆ์™ธ ๋ช…์„ธ๋ฅผ ํ˜„๋ช…ํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๋Š”๋ฐ ์ผ์กฐํ•  ๊ฒƒ์ด๋‹ค. ๋‹น์‹ ์˜ ํ•จ์ˆ˜์— ์˜ˆ์™ธ๋ฅผ ๋”ํ•˜๊ธฐ ์ „์— ์ด๋Ÿฐ ์‚ฌํ•ญ์— ๋Œ€ํ•˜์—ฌ ํ•œ๋ฒˆ์ฏค ์ƒ๊ฐํ•ด ๋ณด์ž.

1.7. Item 15: Understand the costs of exception handling

  • Item 15: ์˜ˆ์™ธ ํ•ธ๋“ค๋ง์— ๋Œ€ํ•œ ๋น„์šฉ ์ง€๋ถˆ ๋Œ€ํ•œ ์ดํ•ด

์‹คํ–‰์‹œ๊ฐ„์— ์˜ˆ์™ธ ํ•ธ๋“ค๋ง์„ ์œ„ํ•˜์—ฌ ํ”„๋กœ๊ทธ๋ž˜๋จธ๋Š” ํ•œ์Œ์˜ ์ฝ”๋“œ๋ฅผ ์ž…๋ ฅํ•ด์•ผ ํ•œ๋‹ค. ์˜ˆ์™ธ ์ค‘์— ๊ฐ์ž์˜ ํฌ์ธํŠธ์— ํ”„๋กœ๊ทธ๋ž˜๋จธ๋Š” ๊ฐ try๋ธ”๋Ÿญ์— ๋“ค์–ด๊ฐ€๋Š” ๋ถ€๋ถ„๊ณผ ๋‚˜์˜ค๋Š” ๋ถ€๋ถ„๋”ฐ์œ„์˜ ์˜ˆ์™ธ๊ฐ€ ๋˜์ €์งˆ๋•Œ ๊ฐ์ฒด ํŒŒ๊ดด์˜ ํ•„์š”์„ฑ์„ ํ™•์ธํ•ด์•ผ๋งŒ ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ฐ try ๋ธ”๋ก์—์„œ ํ”„๋กœ๊ทธ๋ž˜๋จธ๋Š” catch๊ตฌ๋ฌธ์˜ ์—ฐ๊ณ„์™€ ๊ทธ๋“ค๊ณผ ๊ด€๊ณ„๋˜์–ด ์žˆ๋Š” ์˜ˆ์™ธ ๊ฐ์ฒด์˜ ์ข…๋ฅ˜์— ๋Œ€ํ•˜์—ฌ๋„ ์ƒ๊ฐํ•ด ์ฃผ์–ด์•ผ ํ•œ๋‹ค. ์ด๋Ÿฐ ๊ฒƒ๋“ค์€ ๊ฒฐ์ฝ” ๊ณต์งœ๊ฐ€ ์•„๋‹ˆ๋‹ค. ์‹คํ–‰์‹œ๊ฐ„๋™์•ˆ์— ์˜ˆ์™ธ ๋ช…์„ธ์— ๋Œ€ํ•œ ํ™•์ธ ์ž‘์—…๋„ ๊ทธ๋Ÿฌ๋ฉฐ, catch๊ตฌ๋ฌธ์— ๊ฐ์ฒด๊ฐ€ ๋˜์ ธ ์ง”์„๋•Œ ๊ฐ์ฒด์˜ ํŒŒ๊ดด ๋ถ€๋ถ„์— ๋Œ€ํ•œ ์ผ๋„ ์—ญ์‹œ ํ™•์žฅ๋œ๋‹ค. ํ•˜์ง€๋งŒ, ๋งŒ์•ฝ ๋‹น์‹ ์ด try, throw, catchํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ์˜ˆ์™ธ ํ•ธ๋“ค๋ง์—ํ•ด๋‹จ ๋น„์šฉ์€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๊ณ , ํ•ด๋‹น ํ‚ค์›Œ๋“œ๋“ค์— ๋Œ€ํ•œ ๋น„์šฉ ์ง€๋ถˆ๋„ ๋ฏธ๋ฏธํ•œ ์–‘์ด๋‹ค.

์ž ๊ทธ๋Ÿผ ์ „ํ˜€ ์˜ˆ์™ธ ํ•ธ๋“ค๋ง์„ ํ•˜์ง€ ์•Š์•˜์„๋•Œ์˜ ์ง€๋ถˆ ๋น„์šฉ์„ ์ƒ๊ฐํ•ด ๋ณด์ž, ๋‹น์‹ ์€ ๊ฐ์ฒด๋“ค์ด ์ ์žฌ๋˜๊ณ , ์œ ์ง€๋˜๋Š” ํŠธ๋ž™์ด ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์˜ ์‚ฌ์šฉ์„ ์œ„ํ•ด ๊ณต๊ฐ„์— ๋Œ€ํ•œ ๋น„์šฉ ์ง€๋ถˆ์„ ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‹น์‹ ์€ ์ด๋Ÿฐ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋“ค์„ ๊ฐฑ์‹ ํ•˜๊ณ  ์œ ์ง€ํ•˜๋Š”๋ฐ ํ•„์š”ํ•œ ์‹œ๊ฐ„์— ๋Œ€ํ•œ ๋น„์šฉ์„ ์ง€๋ถˆํ•œ๋‹ค. ์ด๋Ÿฐ ๋น„์šฉ๋“ค์€ ์ผ๋ฐ˜์ ์œผ๋กœ ์ •๋‹นํ•œ ์š”๊ตฌ์ด๋‹ค. ๋ฐ˜๋ฉด์— ํ”„๋กœ๊ทธ๋žจ์ด ์˜ˆ์™ธ๋ฅผ ์œ„ํ•œ ์ง€์›์ด ์—†์ด ์ปดํŒŒ์ผ ๋œ๋‹ค๋ฉด ์˜ˆ์™ธ ์ง€์›์„ ํ•˜๊ณ  ์ปดํŒŒ์ผ ํ•˜๋Š” ๋ฐ˜๋Œ€์˜ ๊ฒฝ์šฐ๋ณด๋‹ค ์ข€๋” ๋น ๋ฅด๊ณ , ์ข€๋” ์ž‘์€ ์šฉ๋Ÿ‰์„ ์ฐจ์ง€ํ•œ๋‹ค.

์ด๋ก ์ ์œผ๋กœ ๋‹น์‹ ์€ ์ด๋Ÿฐ(์˜ˆ์™ธ) ๋น„์šฉ์˜ ์ง€์ถœ(์„ ํƒ,select)์ด ์—†์–ด์•ผ ํ•œ๋‹ค.:C++์˜ ํ•œ ๋ถ€๋ถ„์ธ ์˜ˆ์™ธ, ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์˜ˆ์™ธ๋ฅผ ์ง€์›ํ•ด์•ผํ•œ๋‹ค.

ํ”„๋กœ๊ทธ๋žจ์€ ์ผ๋ฐ˜์ ์œผ๋กœ ๋…๋ฆฝ์ ์œผ๋กœ object ํŒŒ์ผ๋“ค์ด ์ƒ์„ฑ๋˜์–ด ์ง€๊ณ , ๋‹จ์ง€ ํ•˜๋‚˜์˜ ์ž‘์„ฑ๋˜์–ด ๋งŒ๋“ค์–ด์ง„ objectํŒŒ์ผ์—์„œ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๊ฐ€ ์—†๋‹ค๋ฉด ๋‹ค๋ฅธ ๊ฒƒ๋“ค์ƒ์˜ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๊ฐ€ ์•„๋ฌด๋Ÿฐ ์˜๋ฏธ๊ฐ€ ์—†๊ธฐ๋•Œ๋ฌธ์—, ๋‹น์‹ ์ด ์˜ˆ์™ธ์ฒ˜๋ฆฌ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด, ๋‹น์‹ ์€ ์ปดํŒŒ์ผ๋Ÿฌ ์ œ์ž‘์‚ฌ๋“ค์ด ์ด๋Ÿฐ ์˜ˆ์™ธ๋“ค์„ ์ง€์›์‹œ ์ผ์–ด๋‚˜๋Š” ๋น„์šฉ์„ ์—†์•จ ๊ฒƒ์ด๋ผ๊ณ  ์˜ˆ์ƒํ•œ๋‹ค. ๊ฒŒ๋‹ค๊ฐ€ objectํŒŒ์ผ์ด ์˜ˆ์™ธ๋ฅผ ๋นผ๊ธฐ์œ„ํ•ด ์•„๋ฌด๋Ÿฐ ์ƒํ˜ธ๊ฐ„์˜ ๋งํฌ๊ฐ€ ๋˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๊ฐ€ ๋“ค์–ด๊ฐ„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€์˜ ๋งํฌ๋Š” ์–ด๋–จ๊นŒ? ์ฆ‰, ํ”„๋กœ๊ทธ๋žจ์˜ ์–ด๋–ค ๋ถ€๋ถ„์ด๋ผ๋„ ์˜ˆ์™ธ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ๋‚˜๋จธ์ง€ ํ”„๋กœ๊ทธ๋žจ์˜ ๋ถ€๋ถ„๋“ค๋„ ์˜ˆ์™ธ๋ฅผ ์ง€์›ํ•ด์•ผ ํ•œ๋‹ค. ์ด๋Ÿฐ ๋ถ€๋ถ„์  ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ์ƒํ™ฉ์€ ์‹คํ–‰์‹œ๊ฐ„์— ์ •ํ™•ํ•œ ์˜ˆ์™ธ๋ฅผ ์žก๋Š” ์ˆ˜ํ–‰์ด ๋ถˆ๊ฐ€๋Šฅ ํ•˜๊ฒŒ ๋งŒ๋“ค๊ฒƒ์ด๋‹ค.

๋ฌผ๋ก  ์ €๊ฒƒ์€ ์ด๋ก ์ด๋‹ค. ์‹ค์งˆ์ ์œผ๋กœ ์˜ˆ์™ธ ์ง€์› ๋ฐด๋”๋“ค์€ ๋‹น์‹ ์ด ์˜ˆ์™ธ ์ž‘์„ฑ์„ ์œ„ํ•œ ์ฝ”๋“œ์˜ ์ฒจ๊ฐ€๋ฅผ ๋‹น์‹ ์ด ์˜ˆ์™ธ๋ฅผ ์ง€์›ํ•˜๋А๋ƒ ๋งˆ๋А๋ƒ์— ๋”ฐ๋ผ ์กฐ์ •ํ• ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“ค์–ด ๋†“์•˜๋‹ค.(์ž‘์„ฑ์ž์ฃผ:์ฆ‰ ์˜ˆ์™ธ ๊ด€๋ จ ์ฒ˜๋ฆฌ์˜ on, off๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.) ๋งŒ์•ฝ ๋‹น์‹ ์ด ๋‹น์‹ ์˜ ํ”„๋กœ๊ทธ๋žจ์˜ ์–ด๋– ํ•œ ์˜์—ญ๊ณผ, ์—ฐ๊ณ„๋˜๋Š” ๋ชจ๋“  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ try, throw, catch๋ฅผ ๋นผ๊ณ  ์˜ˆ์™ธ ์ง€์› ์‚ฌํ•ญ์„ ๋นผ๊ณ  ๋‹น์‹  ์Šค์Šค๋กœ ์†๋„, ํฌ๊ธฐ ๊ฐ™์€ ์˜ˆ์™ธ์ฒ˜๋ฆฌ์‹œ ๋ฐœ์ƒํ•˜๋Š” ๋‹จ์ ์„ ์ œ๊ฑฐํ• ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค. ์‹œ๊ฐ์ด ์ง€๋‚˜ ๊ฐ์— ๋”ฐ๋ผ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์ฐจ์šฉ๋˜๋Š” ์˜ˆ์™ธ์˜ ์ฒ˜๋ฆฌ๋Š” ์ ์  ๋Š˜์–ด๋‚˜๊ฒŒ ๋˜๊ณ , ์˜ˆ์™ธ๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ๊ฐˆ์ˆ˜๋ก ๋‚ด๊ตฌ์„ฑ์ด ์•ฝํ•ด ์งˆ๊ฒƒ์ด๋‹ค. ํ•˜์ง€๋งŒ, ์˜ˆ์™ธ์ฒ˜๋ฆฌ๋ฅผ ๋ฐฐ์ œํ•œ ์ปดํŒŒ์ผ์„ ์ง€์›ํ•˜๋Š” ํ˜„์žฌ์˜ C++ ์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ์ƒ์˜ ์ƒํƒœ๋Š” ํ™•์‹คํžˆ ์˜ˆ์™ธ์ฒ˜๋ฆฌ ๋ณด๋‹ค ์„ฑ๋Šฅ์—์„œ ์šฐ์œ„๋ฅผ ์ ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ์€ ๋˜ํ•œ ์˜ˆ์™ธ ์ „๋‹ฌ(propagate) ์ฒ˜๋ฆฌ์™€, ์˜ˆ์™ธ๋ฅผ ์ƒ๊ฐํ•˜์ง€ ์•Š์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์˜ ์‚ฌ์šฉ์— ๋ฌด๋ฆฌ์—†๋Š” ์„ ํƒ์ด ๋ ๊ฒƒ์ด๋‹ค.

๋‘๋ฒˆ์งธ๋กœ try ๋ธ”๋ก์œผ๋กœ๋ถ€ํ„ฐ์˜ ์˜ˆ์™ธ๋ฅผ ์žก๋Š”(exception-handling)์— ๋Œ€ํ•œ ๋น„์šฉ์„ ์ƒ๊ฐํ•ด ๋ณด์ž ์ด๊ฒƒ์€ ๋‹น์‹ ์ด catch๋กœ ์˜ˆ์™ธ ํ•˜๋‚˜๋ฅผ ์žก๊ธฐ๋ฅผ ์›ํ• ๋•Œ ๋งˆ๋‹ค ์š”๊ตฌ๋˜๋Š” ๋น„์šฉ์ด๋‹ค. ๊ฐ๊ธฐ ๋‹ค๋ฅธ ์ปดํŒŒ์ผ๋Ÿฌ๋“ค์€ ์„œ๋กœ ๋‹ค๋ฅธ ๋ฐฉ์‹์œผ๋กœ try๋ธ”๋ก์˜ ์ ์šฉ์„ ํ•œ๋‹ค. ๊ทธ๋ž˜์„œ ํ•ด๋‹น ๋น„์šฉ์€ ๊ฐ ์ปดํŒŒ์ผ๋Ÿฌ๋งˆ๋‹ค ๋‹ค๋ฅด๋‹ค. ๊ทธ๋ƒฅ ๋Œ€์ถฉ ์–ด๋ฆผ์žก์•„์„œ ์˜ˆ์ƒํ•˜๋ฉด, ๋งŒ์•ฝ try๋ธ”๋ก์„ ์“ฐ๊ฒŒ๋˜๋ฉด, ๋‹น์‹ ์˜ ์ „์ฒด์ ์ธ ์ฝ”๋“œ ์‚ฌ์ด์ฆˆ๋Š” 5-10%๊ฐ€ ๋Š˜์–ด๋‚˜๊ณ , ๋‹น์‹ ์˜ ์‹คํ–‰ ์‹œ๊ฐ„ ์—ญ์‹œ ๋น„์Šทํ•œ ์ˆ˜์ค€์œผ๋กœ ๋Š˜์–ด๋‚œ๋‹ค. ์ด์ œ ์•„๋ฌด๋Ÿฐ ์˜ˆ์™ธ๋ฅผ ๋˜์ง€์ง€ ์•Š๋Š”๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ž;์šฐ๋ฆฌ๊ฐ€ ์—ฌ๊ธฐ์—์„œ ํ† ๋ก ํ•˜๊ณ  ์žˆ๋Š”๊ฒƒ์€ ๋‹จ์ง€ ๋‹น์‹ ์˜ ํ”„๋กœ๊ทธ๋žจ๋‚ด์—์„œ try๊ฐ€ ๊ฐ€์ง€๋Š” ๋น„์šฉ๋งŒ์ด ์•„๋‹ˆ๋‹ค. ์ด๋Ÿฐ ๋น„์šฉ์˜ ์ตœ์†Œํ™”๋ฅผ ์œ„ํ•ด์„œ ์•„๋งˆ ๋‹น์‹ ์€ ํ•„์š”ํ•˜์ง€ ์•Š๋Š” try๋ธ”๋Ÿญ์€ ํ”ผํ•ด์•ผ๋งŒ ํ• ๊ฒƒ์ด๋‹ค.

์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์ˆ˜๋งฃ์€ try ๋ธ”๋Ÿญ์˜ ์˜ˆ์™ธ ์ŠคํŽ™์— ๋Œ€ํ•œ ์ฝ”๋“œ๋ฅผ ์œ„ํ•˜์—ฌ ์ฝ”๋“œ๋ฅผ ๋งŒ๋“ค์–ด๋‚ด์•ผ ํ•œ๋‹ค. ๊ทธ๋ž˜์„œ ์ฝ”๋“œ ์ŠคํŒฉ์€ ์ผ๋ฐ˜์ ์œผ๋กœ ํ•˜๋‚˜์˜ try๋ธ”๋Ÿญ๋‹น ๊ฐ™์€ ์ˆ˜์˜ ๋น„์šฉ์„ ์ง€์ถœํ•˜๊ฒŒ ๋œ๋‹ค. ์ž ๊น?(excuse me?) ๋‹น์‹ ์€ ์˜ˆ์™ธ ์ŠคํŒฉ์ด ๋‹จ์‹œ ์ŠคํŒฉ์ธ, ์ฆ‰ ์ฝ”๋“œ๋ฅผ ๋งŒ๋“ค์–ด ๋‚ด๋Š”๊ฑธ ์ƒ๊ฐํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ๋งํ•œ๋‹ค. ์ž, ๋‹น์‹œ์€ ๊ทธ๋Ÿฐ ์ƒ๊ฐ์— ๊ด€ํ•ด์„œ ์กฐ๊ธˆ ์ƒˆ๋กœ์šด ๋ช‡๊ฐ€์ง€๋ฅผ ๊ฐ์•ˆํ•ด ๋ดใ….

๋ฌธ์ œ์˜ ์ดˆ์ ์€ ์˜ˆ์™ธ๊ฐ€ ๋˜์ง€๋Š” ๋น„์šฉ์ด๋‹ค. ์‚ฌ์‹ค ์˜ˆ์™ธ๋Š” ํฌ๊ท€ํ•œ ๊ฒƒ์ด๋ผ ๋ณด๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๋ ‡๊ฒŒ ํฌ๊ฒŒ ๊ฐ์•ˆํ•  ๋‚ด์šฉ์ด ์•„๋‹ˆ๋‹ค. ๊ทธ๋“ค์ด ์˜ˆ์™ธ์ ์ธ(exceptional) ๋ฌธ์ œ์˜(event) ๋ฐœ์ƒ์„ ์ง€์นญํ•จ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ๋ง์ด๋‹ค. 80-20 ๊ทœ์น™์€(Item 16์—์„œ ์–ธ๊ธ‰) ์šฐ๋ฆฌ์—๊ฒŒ ๊ทธ๋Ÿฐ ์ด๋ฒคํŠธ๋“ค์€ ๊ฑฐ์˜ ํ”„๋กœ๊ทธ๋žจ์˜ ๋ถ€๊ณผ๋˜๋Š” ์„ฑ๋Šฅ์— ์ปค๋‹ค๋ž€ ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๊ณ  ๋งํ•œ๋‹ค. ๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ , ๋‚˜๋Š” ๋‹น์‹ ์ด ์ด ๋ฌธ์ œ์— ๊ด€ํ•˜์—ฌ ์˜ˆ์™ธ๋ฅผ ๋˜์ง€๊ณ , ๋ฐ›๋Š” ๋น„์šฉ์— ๊ด€ํ•œ ๋Œ€๋‹ต์—์„œ ์–ผ๋งˆ๋‚˜ ํด๊นŒ๋ฅผ ๊ถ๊ธˆํ• ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•œ๋‹ค. ๋Œ€๊ฐ• ์ผ๋ฐ˜์ ์ธ ํ•จ์ˆ˜์˜ ๋ฐ˜ํ™˜์—์„œ ์˜ˆ์™ธ๋ฅผ ๋˜์ง„๋‹ค๋ฉด ๋Œ€์ถฉ ์„ธ๊ฐœ์˜ ๋ช…๋ น์–ด ์ •๋„ ๋” ๋А๋ ค์ง€๋Š”(three order of magnitude) ๊ฒƒ์ด๋ผ๊ณ  ๊ฐ€์ •ํ• ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ๋‹น์‹ ์€ ๊ทธ๊ฒƒ๋งŒ์ด ์•„๋‹๊ฒƒ์ด๋ผ๊ณ  ์ด์•ผ๊ธฐ ํ• ๊ฒƒ์ด๋‹ค. ๋ฐ˜๋Œ€๋กœ ๋‹น์‹ ์ด ์ด๋Ÿฐ ๋…ผ์Ÿ์„ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋‚˜ ๋ฃจํ”„์˜ ์ˆœํšŒ ๊ตฌ์กฐ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ๋งŒ๋“œ๋Š”๋ฐ ์‹ ๊ฒฝ์„ ์“ด๋‹ค๋ฉด ๋” ์ข‹์€ ์‹œ๊ฐ„์„ ๋ณด๋‚ด๋Š” ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•œ๋‹ค.

๊ทธ๋ ‡์ง€๋งŒ ์ž ๊น, ๋‚ด๊ฐ€ ์ด๋Ÿฐ๊ฒƒ์— ๊ด€ํ•ด์„œ ์–ด๋–ป๊ฒŒ ์•„๋ƒ๊ตฌ? ๋งŒ์•ฝ ์˜ˆ์™ธ๋ฅผ ์œ„ํ•œ ์ง€์›์€ ์ตœ๊ทผ์˜ ์ปดํŒŒ์ผ๋Ÿฌ์™€ ใ„ท์ปดํŒŒ์ผ๋Ÿฌ๊ฐ„์— ๋‹ค๋ฅธ ๋ฐฉ์‹์œผ๋กœ ์ง„ํ–‰๋œ๋‹ค๋ฉด์„œ ๋น„์šฉ์ด 5-10%๋–จ์–ด์ง€๊ณ  ์Šคํ”ผ๋“œ ์—ญ์‹œ ๋น„์Šทํ•˜๊ฒŒ ๋–จ์–ด์ง€๊ณ  ์„ธ๊ฐœ ๋ช…๋ น์–ด ์ •๋„ ๋Š˜์–ด๋‚˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ์„ฑ๋Šฅ ์ €ํ•˜์— ๊ด€ํ•œ ์œ„์˜ ์–ธ๊ธ‰ ์ด๋Ÿฐ๊ฒƒ์— ๊ด€ํ•œ ์ถœ์ฒ˜๋“ค? ์•„๋งˆ ๋‚ด๊ฐ€ ํ•ด์ค„์ˆ˜ ์žˆ๋Š” ๋‹ต๋ณ€์€ ๋‹ค์†Œ ๋†€๋ž„๊ฒƒ์ด๋‹ค.:๋‹น์‹ ์ด try๋ธ”๋ก๊ณผ ์˜ˆ์™ธ ์ŠคํŽ™์„ ์‚ฌ์šฉ์„ ํ•„์š”ํ•œ ๊ณณ๋งŒ ์‚ฌ์šฉํ•˜๋„๋ก ์ œํ•œํ•ด๋ผ;๊ทธ๋ฆฌ๊ณ  ์ปดํŒŒ์ผ ํ•ด๋ด๋ผ, ๊ทธ๋ž˜๋„ ์„ค๊ณ„์ƒ์— ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค๋ฉด ์ผ๋‹จ ์ž์‹ ์˜ ์„ค๊ณ„๋ฅผ ๋‹ค์‹œ ๊ทธ๋ ค๋ณด๊ณ  ์ƒ๊ฐํ•ด ๋ณด๋ผ, ๊ฑฐ๊ธฐ์—๋‹ค, ์—ฌ๊ธฐ์ €๊ธฐ ๋‹ค๋ฅธ ๋ฒค๋”๋“ค์˜ ์ปดํŒŒ์ผ๋Ÿฌ๋กœ ์ปดํŒŒ์ผ ํ•ด๋ด๋ผ ๊ทธ๋Ÿผ ์•Œ์ˆ˜ ์žˆ๋‹ค.

Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2021-02-07 05:23:49
Processing time 0.0256 sec