In our case here, we get
1. error_index as 4
2. sql%bulk_exceptions.count as 1
3. and sql%bulk_exceptions.error_code as 2291.
What I understand is, that without using SAVE EXCEPTIONS, Orcale does stop the execution of further statements, and stores the error index and code in SQL%BULK_EXCEPTIONS. This single record should obviously contain the index at which it failed, but surprisingly, it contains the last consecutively numbered index it encounters in the collection. Probably a bug, not sure !