λ°˜μ‘ν˜•

μŠ€νƒ ν’€κΈ°(Stack Unwinding)λž€?

μ˜ˆμ™Έκ°€ λ°œμƒν•œ ν•¨μˆ˜μ—μ„œ μ˜ˆμ™Έκ°€ μ²˜λ¦¬λ˜μ§€ μ•ŠμœΌλ©΄, μƒμœ„ ν•¨μˆ˜λ‘œ λŒμ•„κ°€ μ˜ˆμ™Έκ°€ 처리되기λ₯Ό μ‹œλ„ν•©λ‹ˆλ‹€. λ§Œμ•½, μƒμœ„ ν•¨μˆ˜μ—λ„ μ—†λ‹€λ©΄ λ‹€μ‹œ κ·Έ μœ„μ˜ μƒμœ„ ν•¨μˆ˜λ‘œ λŒμ•„κ°€λ©° λ°˜λ³΅ν•˜κ²Œ λ©λ‹ˆλ‹€. λ§Œμ•½, μ˜ˆμ™Έκ°€ λ°œμƒν–ˆλŠ”λ° μ–΄λŠ κ³³μ—μ„œλ„ try-catch 문이 μ—†λ‹€λ©΄ ν”„λ‘œκ·Έλž¨μ€ μ’…λ£Œλ˜κ³  λ§™λ‹ˆλ‹€.

μ΄λ ‡κ²Œ 이전에 호좜된 ν•¨μˆ˜λ‘œ 계속 λŒμ•„κ°€λŠ” 것을 μŠ€νƒ ν’€κΈ°(Stack Unwinding)라고 ν•©λ‹ˆλ‹€. λ‹€μŒμ˜ 예제 μ½”λ“œλ₯Ό λ³΄κ² μŠ΅λ‹ˆλ‹€.

namespace ExamException
{
    class Program
    {
        static void func1()
        {
            func2();
        }

        static void func2()
        {
            func3();
        }

        static void func3()
        {
            throw new Exception("μ˜ˆμ™Έ λ°œμƒ!");
        }

        static void Main(string[] args)
        {
            func1();
        }
    }
}

Main ν•¨μˆ˜μ—μ„œ func1()을 ν˜ΈμΆœν•˜λ©΄, func2(), func3()이 μ°¨λ‘€λŒ€λ‘œ 호좜되고, func3()μ—μ„œ μ˜ˆμ™Έκ°€ λ°œμƒν•˜λŠ” μ½”λ“œμž…λ‹ˆλ‹€. μ˜ˆμ™Έκ°€ λ°œμƒν•˜λŠ” 지점에 Break pointλ₯Ό μ§€μ •ν•˜κ³ , 디버깅을 μ‹€ν–‰ν•œ ν›„ λΉ„μ£Όμ–Ό μŠ€νŠœλ””μ˜€μ˜ 호좜 μŠ€νƒ(Call Stack) 창을 μ—΄μ–΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

호좜 μŠ€νƒ ν™”λ©΄
호좜 μŠ€νƒ ν™”λ©΄

호좜 μŠ€νƒ 맨 μ•„λž˜μ— Main ν•¨μˆ˜λ₯Ό μ‹œμž‘μœΌλ‘œ, μ°¨λ‘€λŒ€λ‘œ func1(), func2(), func3()이 κΈ°λ‘λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€. 이것이 μŠ€νƒμ— μŒ“μ—¬μžˆλŠ” ν•¨μˆ˜μ˜ 호좜 λͺ©λ‘μ΄λ©°, func3()μ—μ„œ μ˜ˆμ™Έκ°€ λ°œμƒν–ˆμœΌλ‹ˆ try-catch에 도달할 λ•ŒκΉŒμ§€ func2(), func1(), Main ν•¨μˆ˜κΉŒμ§€ λŒμ•„κ°€λŠ” 것이죠. 이것을 μŠ€νƒ 풀기라고 ν•©λ‹ˆλ‹€.

μŠ€νƒμ΄ μŒ“μ΄κ³  ν’€λ¦¬λŠ” κ³Όμ •
μŠ€νƒμ΄ μŒ“μ΄κ³  ν’€λ¦¬λŠ” κ³Όμ •

 

μ˜ˆμ™Έμ™€ ν”„λ‘œκ·Έλž¨ μ„±λŠ₯ 영ν–₯

μœ„μ—μ„œ μ–ΈκΈ‰ν•œ λŒ€λ‘œ, μŠ€νƒμ„ ν‘ΈλŠ” κ³Όμ •μ—μ„œ Stack Trace와 같은 μ˜ˆμ™Έ 정보λ₯Ό 가지닀 λ³΄λ‹ˆ, μ˜ˆμ™Έκ°€ λ°œμƒν•˜λ©΄ μ˜€λ²„ν—€λ“œ(Overhaed)κ°€ λ°œμƒν•˜κ²Œ λ©λ‹ˆλ‹€. 그리고 이λ₯Ό μ˜ˆμ™Έ λΉ„μš©(Exception cost)이라고도 λΆ€λ¦…λ‹ˆλ‹€.

그런데 μ—¬κΈ°μ„œ μ˜€ν•΄μ˜ μ†Œμ§€κ°€ μžˆλŠ”λ°μš”. μ˜ˆμ™Έ 처리λ₯Ό μ‚¬μš©ν•˜λ©΄ 항상 μ˜€λ²„ν—€λ“œκ°€ λ°œμƒν•˜λŠ” 것이 μ•„λ‹™λ‹ˆλ‹€. 즉, try-catch 블둝을 μ‚¬μš©ν•œλ‹€κ³  항상 μ„±λŠ₯에 영ν–₯을 λ―ΈμΉ˜λŠ” 것이 μ•„λ‹ˆλΌλŠ” λœ»μž…λ‹ˆλ‹€.

사싀 try-catch 블둝을 μ‚¬μš©ν•˜λ”λΌλ„ μ˜ˆμ™Έκ°€ λ°œμƒν•˜μ§€ μ•ŠμœΌλ©΄ μ„±λŠ₯ μ €ν•˜κ°€ 거의 μ—†λ‹€κ³  λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€. 이에 λŒ€ν•œ μ„±λŠ₯ 검증은 ꡬ글링을 톡해 μ‰½κ²Œ μ°Ύμ•„λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€.

https://pspdfkit.com/blog/2020/performance-overhead-of-exceptions-in-cpp/

 

Investigating the Performance Overhead of C++ Exceptions | PSPDFKit

C++ exceptions have their place, but using an alternative is recommended for general program flow control.

pspdfkit.com

https://yesarang.tistory.com/371

 

C++ 이야기 μ„œλ₯Έλ‘λ²ˆμ§Έ: μ˜ˆμ™Έκ°€ μ„±λŠ₯에 λ―ΈμΉ˜λŠ” 영ν–₯

2009/09/25 - [S/W개발/C++ 이야기] - C++ 이야기 μ„œλ₯Έν•œλ²ˆμ§Έ: μ™œ μ˜ˆμ™Έλ₯Ό μ“°λŠ” 게 μ’‹μ„κΉŒμš”? μ—μ„œ μ™œ μ˜ˆμ™Έλ₯Ό μ“°λŠ” 것이 쒋은지에 λŒ€ν•΄ μ–˜κΈ°λ₯Ό ν•΄ λ΄€μŠ΅λ‹ˆλ‹€. μ •λ¦¬ν•΄μ„œ λ§μ”€λ“œλ¦¬μžλ©΄ 결함내성 νŠΉμ„±(fault-tol

yesarang.tistory.com

κ²°λ‘ 

λΆ„λͺ…νžˆ try-catch 문을 μ‚¬μš©ν•œ μ˜ˆμ™Έ μ²˜λ¦¬κ°€ μ—λŸ¬ μ½”λ“œ λ°˜ν™˜ν˜• λ³΄λ‹€λŠ” 더 가독성 있고 κ²¬κ³ ν•œ ν”„λ‘œκ·Έλž¨μ„ λ§Œλ“€ 수 μžˆμŠ΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ κ·Έλ ‡λ‹€κ³  λ¬΄λΆ„λ³„ν•˜κ²Œ λͺ¨λ“  곳에 try-catchλ₯Ό μ‚¬μš©ν–ˆλ‹€κ°„ μ„±λŠ₯ μ €ν•˜λ₯Ό κ²ͺ게 λ©λ‹ˆλ‹€. λ”°λΌμ„œ, μ˜ˆμƒμ΄ λ˜λŠ” κ³³μ—λŠ” 쑰건 문으둜 μ˜ˆμ™Έλ₯Ό μ²˜λ¦¬ν•˜κ³ , μ˜ˆμƒμ΄ λ˜μ§€ μ•ŠλŠ” 곳에 try-catchλ₯Ό λ³΅ν•©μ μœΌλ‘œ μ‚¬μš©ν•˜λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€.

λ°˜μ‘ν˜•