As you can see, executing a throw expression is semantically similar to calling longjmp, and a handler is like a setjmp. Exception handling is a language mechanism, not a library feature. The overhead of transferring control to a handler is invisible to the programmer. Handlers are found by matching the type of the exception object that you throw. This allows you to handle categories of exceptions with a single handler, and to classify them via inheritance.
Exception handling is a run-time mechanism.
You can't always tell which handler will catch a specific exception by examining the source code. The last point is significant. A library developer may be able to detect when an error occurs, such as an argument out of range, but the developer doesn't know what to do about it. You, the user, can't always detect an exceptional condition, but you know how your application needs to handle it. Hence, exceptions constitute a protocol for runtime error communication between components of an application.