Я ставлю. Так и пишу ASSERT(Alg.InRange(Ind, 0, Count - 1))).
В данном случае, имхо, нужен именно ASSERT. Если при анализе возможного использования функции выясняется, что чаще всего она будет вызываться с корректными данными, то использую ASSERT, а если со слепыми - ошибки. Слепые - это когда удобнее вызвать функцию и обработать результат, а не самому фильтровать параметры. В частности, LexParser, например, может позволять делать GotoLine(x) без строгой проверки на существование строки, иначе код вашего приложения будет захламлён проверками на вызов любой функции LexParser (например, GetCharAtPos, GotoPreviousLine, GotoPos and so on).

То есть если типичный вызов вашей функции будет:
IF GetAt(c, Ind) THEN
....
то нужно возвращать код ошибки, а если

...Elem:=GetAt(c, i)...
То ASSERT. В частности, для списков, массивов, контейнеров я бы использовал только ASSERT-ы, потому как обычно известно кол-во их элементов и ожидается корректное возвращение оных.