One possible cause is that, if your interrupt handler is in a C++ source file, the Interrupt handler must be a C linkage functions. In C++ you must then prepend
extern "C" to the function declaration and definition, otherwise the function name will be decorated by the C++ compiler to become something like
TIM1_IRQHandler_v instead of
TIM1_IrqHandler, thus the linker will pick the default handler which just loops indefinitely...