Ocurren el error en tiempo de ejecucion, porque hacerlo en tiempo de compilacion es un problema particularmente espinoso:
https://duckduckgo.com/?q=compile+time+bounds+checking
Luego esta el hecho que el indice es un Int(32/64) que va desde el - al + en la escala numerica, en vez desde 0-+ (osea: El tipo de datos no es el indicado para un indice de array posicional). Luego el que String/Array son dinamicos, y detectar que no se pase un indice IMPLICA detectar cuando se redimensiona el array... lo que basicamente implica tener que correr el codigo

(Hay tecnicas que se pueden usar, llamadas "data-flow", pero son muy complejas de implementar si se quiere una solucion GENERICA).
La solucion? En primer lugar habria que arrancar con dejar de usar INTs y usar un tipo de datos mas adecuado. Luego, usar un sub-rango cuando el tamño maximo es conocido (ej: Si indexamos meses y sabemos que no son mas de 12). Pero cuando el tamaño es indeterminado? Igual toca comprobar en tiempo de ejecucion