Because operator[] doesn't do range checking so no exceptions are ever thrown. If you want an out_of_range exception to be thrown when you use an invalid index you should use the at function instead.
The vector operator [] is not bounds checked. So don't expect it to throw an exception.
A similar member function, vector::at, has the same behavior as the operator [] function, except that vector::at is bound-checked and signals if the requested position is out of range by throwing an out_of_range exception.