Patrón "TryParse / Parse like": ¿cuál es la mejor manera de implementarlo?

Esta pregunta es un seguimiento deCómo indicar que un método no tuvo éxito. El patrón xxx () Tryxxx () es algo que puede ser muy útil en muchas bibliotecas. Me pregunto cuál es la mejor manera de ofrecer ambas implementaciones sin duplicar mi código.

Lo que es mejor

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;
    }

o

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)
{
    //...
}

Asumiría instintivamente que el primer ejemplo es más correcto (usted sabe exactamente qué excepción ocurrió), pero ¿no podría el intentar / atrapar ser demasiado caro? ¿Hay alguna manera de atrapar la excepción en el segundo ejemplo?

Respuestas a la pregunta(4)

Su respuesta a la pregunta