Exception handling is usually the most expensive feature in a language (e.g. C++ or C#). Just keep in mind or imagine what needs to be done to support exceptions.
Not only it requires special hooks on each stack frame (increasing stack size), it requires a runtime system to deal with exceptions: going through a list of descriptors, finding the matching catch block. This alone is rather complex, but gets more complex due the fact that the exception runtime needs to unwind the stack, including caring and calling all the different destructors, and continuing iterating the lists of more catch blocks and finding matching handlers. Even more, you can throw new exceptions in a catch block making things yet a bit more complex to deal with.
The exception feature is very useful and comes handy, but compared to all the other language features it is the most expensive one to me. That's why in some programming languages you can turn it off. Which might lead itself to a problem: check the case of the Ariane V rocket failure where exception handling had been turned off to meet the performance requirements.
Other than that: have a read at How is the C++ exception handling runtime implemented? - Stack Overflow or a good video about implementation details: YouTube
I hope it helps,
Erich