Wzór „TryParse / Parse like”: jaki jest najlepszy sposób jego wdrożenia

To pytanie jest kontynuacjąJak wskazać, że metoda zakończyła się niepowodzeniem. Wzór xxx () Tryxxx () jest bardzo przydatny w wielu bibliotekach. Zastanawiam się, jaki jest najlepszy sposób oferowania obu implementacji bez duplikowania mojego kodu.

Co jest najlepsze:

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

lub

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

Instynktownie zakładam, że pierwszy przykład jest bardziej poprawny (wiesz dokładnie, który wyjątek się wydarzył), ale czy try / catch nie był zbyt drogi? Czy istnieje sposób na złapanie wyjątku w drugim przykładzie?

questionAnswers(4)

yourAnswerToTheQuestion