Existe algum problema em ter lógica de repetição baseada em qualquer exceção (e não em SqlException específica)? Estou assumindo que as exceções resultantes de erros de programação seriam eventualmente descobertas durante a fase de teste e exceções graves (como SO) não seriam capturadas pelo bloco catch, de modo que o bloco de exceção genérico para lógica de repetição pode ser uma ideia aceitável.
Caso contrário, provavelmente sua solução de encapsular
ExecuteReader
seria uma boa ideia. Considerando que isso está documentado
comportamento, você também precisa prestar atenção a outras exceções que o método ExecuteReader pode lançar - então você provavelmente precisará antecipar IOException
e ObjectDisposedException
além de InvalidOperationException
.