Esta pregunta es una continuación de How to indicate that a method was unsuccessful. 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.patrón "TryParse/Parse like": cuál es la mejor manera de implementarlo
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)
{
//...
}
Me instintivamente por hecho que el primer ejemplo es más correcto (usted sabe exactamente lo que sucedió excepción), pero se le fue el intento/¿La captura es demasiado cara? ¿Hay alguna forma de detectar la excepción en el segundo ejemplo?
Estoy de acuerdo con su instinto (evite la excepción para el caso TryX si es posible) siempre que su implementación de TryX no tenga que atrapar una excepción (es decir, la excepción está siendo generada por su código, no el código llama). –
Además, no estoy seguro de lo que quiere decir con "¿Hay alguna manera de detectar la excepción en el segundo ejemplo?" - atrapa qué excepción?Desea lanzar desde DoSomething (aunque lanzaría una excepción específica de lo sucedido, no la general). –
@Jonathan: Quise decir "volver a lanzar la excepción que ocurrió en el procesamiento interno de una manera que la persona que llama puede saber qué causó el error" – Luk