Furthermore, exceptions are thrown by the compiler (RTL?) even during division by zero, floating-point operations, and some other "basic" operations.
The language level exception is a reaction to a RTL level run error which in turn is a reaction to an exception triggered by the CPU and passed to the program by the OS.