My question is how CPU tell kernel about the exception ...
... and how it knows what next instruction to execute ...
On x86 CPUs, exceptions are interrupts (just like hardware interrupts or interrupts called by the int instruction):
When some exception happens, the CPU will push the address of the instruction and some other information on the kernel's stack and jump to the address specified in the interrupt vector table.
The kernel may read the address pushed on the stack to get information about which instruction caused the exception.
... and if there is some details ...
Different types of exceptions call different interrupt vectors:
A "division by zero" will cause a jump to the address specified in the first entry in the interrupt vector table; a "page fault" will cause a jump to the address specified in the 15th entry of that table.
The OS has different "exception handlers" (assembly programs which are called by the hardware in the case of an exception) for different kinds of exceptions. The addresses of these handlers are stored in the interrupt vector table. The CPU will read the address of the handler from that table.
For some exception types (e.g. "general protection fault") the CPU writes additional information to the stack. For other exception types (e.g. "page fault") there are special registers containing additional information.