Padrão "TryParse / Parse like": qual é a melhor maneira de implementá-lo

Esta questão é um follow-up deComo indicar que um método não teve êxito. O padrão xxx () Tryxxx () é algo que pode ser muito útil em muitas bibliotecas. Eu estou querendo saber qual é a melhor maneira de oferecer ambas as implementações sem duplicar meu código.

O que e melhor:

public int DoSomething(string a)
{
     // might throw an exception
}
public bool TrySomething(string a, out result)
{
    try
    {
        result = DoSomething(a)
        return true;
    }
    catch (Exception)
    {
        return false;
    }

ou

public int DoSomething(string a)
{
     int result;
     if (TrySomething(a, out result))
     {
         return result;
     }
     else
     {
         throw Exception(); // which exception?
     }
}
public bool TrySomething(string a, out result)
{
    //...
}

Eu instintivamente presumo que o primeiro exemplo é mais correto (você sabe exatamente qual exceção aconteceu), mas o try / catch não poderia ser muito caro? Existe uma maneira de capturar a exceção no segundo exemplo?

questionAnswers(4)

yourAnswerToTheQuestion