Generally, with a generic method like this, you want the caller to know that they passed an invalid value into your method. Since the type is non-nullable, the correct thing to do is to throw an exception back to the caller. You could just leave it alone and let the ArgumentOutOfRangeException bubble back to the caller. Or, if you want to use your own custom exception type or message, you would catch the ArgumentOutOfRangeException, and instantiate your own exception, setting the Inner Exception to the ArgumentOutOfRangeException that you caught.
If you don't want to use try/catch, you can use your existing logic, but in the "else" part, throw your own exception, without an inner exception.
The only other option is to return default(t), but I would not recommend this. If you do that, then the caller of the method will not know that they tried to access an invalid value, and may go on their merry way believing that the default value that they got back (say, 0 for in int or false in the case of a bool) is the actual value stored at the requested index, which would most likely lead to bugs in their solution.