The bound is specified for client-side arrays and vertex buffer objects. Only the place from where you fetch is different, i.e. system-memory or VRAM.
And that bound is (at least to some extend) given if the data resides in a BufferObject.
It doesn't make anything better - at all. The upper bound can still be completely invalid - again, in both usage scenarios.
But this makes things just a little better
But you have the opportunity. It's all right there. The problem is: you also have the opportunity to screw everything up. But that's inherently a problem of unchecked random memory access - it's nothing specific to OpenGL. That's why they specified GL_ARB_robustness. When enabled, you at least avoid program termination but values are still undefined. One advantage is, that you probably see that fetching goes wrong and for which objects in your scene it goes wrong. This narrows down the choices when searching an error.
Having an opportunity to give the upper bound explicitely would likely ease error-tracking as the range of indices that can accidently be drawn without triggering a segv gets narrowed down.
I actually don't understand that sentence. The default behavior of a crashing application is a crash. That's actually not the worst that could happen. The worst would be a running application with bogus memory accesses and inconsistent state that runs in perpetuity.
I seldomly run crashing code outside the Debugger so I don't have that much experience when it comes to the default-behaviour in such situations