I am quite surprised to see Brandan recommending use of signals in this case, but anyway...
The problem with using 'throw' in a signal handler is that it's outside of the C++ standard and you have to be very careful with the stack. The November 2014 draft C++ standard even says "In particular, a signal handler using exception handling is very likely to have problems." in a footnote.
According to the C99 standard:
If the signal occurs other than as the result of calling the abort or raise function, the behaviour is undefined if the signal handler refers to any object with static storage duration other than by assigning a value to an object declared as volatile sig_atomic_t, or the signal handler calls any function in the standard library other than the abort function, the _Exit function, or the signal function with the first argument equal to the signal number corresponding to the signal that caused the invocation of the handler.
And the C++ (Nov 2014 draft) standard:
The behavior of any function other than a POF used as a signal handler in a C++ program is implementation-defined.
If the "signal" has been created by "raise" in the same thread, your signal handler is probably running like a "normal" function call, so all should be fine. If, however, it's been called by the kernel, you need to make sure that the stack is in a state that the C++ runtime understands. If you're using an unconventional method to emulate POSIX-style signals (e.g. running them on a different thread, which is perfectly OK according to 1.10.2 in the Nov 2014 C++ draft), then making it work is going to be difficult if not impossible.
Of course, for your own kernel, you can define the way that signals work in a way that's compatible with the C++ runtime's exception mechanism. At the very least, you'll need to make sure you "unmask" the signal before you use 'throw', or you'll never receive that signal again.