Ao analisar a entrada do usuário, geralmente é recomendável não lançar e capturar exceções, mas usar métodos de validação. No .NET BCL, essa seria a diferença entre, por exemplo, int.Parse(lança uma exceção em dados inválidos) e int.TryParse(retorna falseem dados inválidos).
Estou projetando meu próprio
Foo.TryParse(string s, out Foo result)
método e não tenho certeza sobre o valor de retorno. Eu poderia usar boolcomo o próprio TryParsemétodo do .NET , mas isso não daria nenhuma indicação sobre o tipo de erro, sobre o motivo exato pelo qual s não poderia ser analisado em um arquivo Foo. (Por exemplo, spode ter parênteses sem correspondência, ou o número errado de caracteres, ou um Barsem um correspondente Baz, etc.)
Como usuário de APIs, não gosto de métodos que retornam um booleano de êxito / falha sem me dizer por que a operação falhou. Isso torna a depuração um jogo de adivinhação, e também não quero impor isso aos clientes da minha biblioteca.
Posso pensar em várias soluções alternativas para esse problema (retornar códigos de status, retornar uma string de erro, adicionar uma string de erro como um parâmetro out), mas todas elas têm suas respectivas desvantagens e também quero permanecer consistente com as convenções de o .NET Framework .
Assim, minha pergunta é a seguinte:
Existem métodos no .NET Framework que (a) analisam a entrada sem gerar exceções e (b) ainda retornam informações de erro mais detalhadas do que um simples booleano verdadeiro / falso?
Parse().