debug-on-error is non-
nil then an error always enters the debugger. However, if the debugger is already open (but its window is hidden behind another frame or whatever) then you might not notice this.
Check the mode line for
[...] and see whether you have a buffer named
*Backtrace*, if the backtrace does not seem to get popped up.
If the backtrace is already open then quit it, using
q. Sometimes you can continue with the debugger (using
c) after an error occurs but typically you cannot do much at that point.
The point of entering the debugger on an error is to see what caused it. After you see that, quit the debugger. The next error will then reopen it.
Once you find the cause of an error that was raised, you can, for example, use
debug-on-entry to debug the function that caused it. That will give you a better understanding of what's wrong.
(Read the Elisp manual about using the debugger.)