I recently faced a similar problem in my project. Eventually I just implemented a new Array type that overrides getindex like:
getindex(A::DirichletArray, I...) =
checkbounds(Bool, A.a, I...) ? A.a[I...] : A.oob_val
This kind of approach could easily be extended for your case by checking indices appropriately.
You can find details on the Array interface in the manual.