2009-02-06 13 views
9

Actualmente estoy en un intento de captura encontrar si una propiedad se ha establecido correctamente para el valor bool que debería ser así ...C# ¿qué tipo de excepción debo plantear?

public void RunBusinessRule(MyCustomType customType) 
{ 
    try 
    { 
     if (customType.CustomBoolProperty == true) 
     { 
      DoSomething(); 
     } 
     else 
     { 
      throw new Exception("This is obviously false or possibly null lets throw up an error."); 
     } 
    } 
    catch(Exception) 
    { 
     throw; 
    } 
} 

Ahora el acuerdo con lanzar este error para mí es que soy utilizando el análisis fuente de Microsoft y me da un error que dice "CA2201: Microsoft.Usage: Object.RunBusinessRule (MyCustomType) crea una excepción de tipo 'Excepción', un tipo de excepción que no es lo suficientemente específico y nunca debe ser invocado por el código de usuario. Si se puede lanzar esta instancia de excepción, use un tipo de excepción diferente.

Soooo ¿Qué excepción debo arrojar que sea lo suficientemente específica para Microsoft .., por la circunstancia de arrojar un error sobre el manejo de la lógica de mi propia aplicación y cuándo quiero "lanzar".

Respuesta

15
ArgumentException 
InvalidOperationException 
FormatException 

El argumento de la transmisión no fue bueno.

+0

'InvalidOperationException' es *" La excepción que se produce cuando una llamada a un método no es válida para el estado actual del objeto. "*, Es decir, los campos de clase, no los parámetros. – brianary

13

¿Debería lanzar una excepción?

Tener un valor booleano falso no es exactamente una circunstancia excepcional.

EDITAR

Mi respuesta original era un poco escueta así que voy a elaborar ...

De su ejemplo, no está claro lo que los objetos reales, propiedades y métodos representan. Sin esta información, es difícil decir qué tipo de excepción, si corresponde, es apropiada.

por ejemplo, me gustaría considerar el siguiente un uso perfectamente válido de una excepción (y su código real bien podría ser algo como esto, pero no podemos decir por tu ejemplo):

public void UpdateMyCustomType(MyCustomType customType) 
{ 
    if (!customType.IsUpdateable) 
     throw new InvalidOperationException("Object is not updateable."); 

    // customType is updateable, so let's update it 
} 

Pero en el caso general, sin saber más acerca de su modelo de dominio, diría que algo como esto (un valor booleano falso) no es realmente excepcional.

1

Un ligero a un lado, pero se puede simplificar el código un poco ...

public void RunBusinessRule(MyCustomType customType) 
{ 
    if (customType.CustomBoolProperty == false) 
    { 
     throw new Exception("This is obviously false or possibly null lets throw up an error."); 
    } 

    DoSomething(); 
} 

En cuanto al tipo de excepción a tirar, podría considerar ApplicationException o InvalidOperationException, o puede definir su propio tipo de excepción.

+0

Personalmente, la simplificación de este tipo siempre me molesta. En cuanto a la legibilidad, creo que si dices "Haz esto solo si bool es verdad", entonces debería ser parte de la declaración de si/entonces. Es solo mi opinión personal, pero siempre preferiría ver explícitamente que implícita. –

12

Crea tu propia excepción extendiendo Exception. Por ejemplo: RuleViolationException

0

Haga su propia excepción personalizada extendiendo System.Exception y lance eso. Puede ponerse aún más loco y tener todo un árbol de tipos de excepción si lo desea.

0

Puede crear simplemente un ValidationException personalizado que solo se utiliza para la validación de su lógica de negocio. O puede crear una excepción de validación por separado para cada tipo de error de validación, aunque probablemente sea una sobrecarga.

1

sé que se trata de una pregunta lanzar una excepción, pero creo que sería más apropiado hacer una assertation aquí:

// Precondition: customType.CustomBoolProperty == true 
System.Diagnostics.Debug.Assert(customType.CustomBoolProperty) 
DoSomething(); 
1

excepción InvalidArgument está bien, pero mejor aún, un ApplicationException.

+1

Microsoft solía recomendar ApplicationException, pero ya no más: consulte http://msdn.microsoft.com/en-us/library/seyhszts.aspx para obtener más información. – LukeH

+0

En realidad, esa publicación dice que no cree sus propias excepciones derivadas de ApplicationException; no dice no lanzar ApplicationException. – ALEXintlsos

+3

[EDITAR] SIN EMBARGO, el análisis de código de Visual Studio dice que ApplicationException "no es suficientemente específico y nunca debe ser invocado por el código de usuario" . – ALEXintlsos

2

La respuesta aquí es que no debe arrojar ninguna excepción. ¿Por qué lanzar una excepción solo para atraparla de nuevo en un segundo y volver a lanzarla?

0

No es realmente lo que estaba pidiendo, pero hay un montón de gente que ya ha dado respuestas con las que estoy de acuerdo, pero también debe evitar el uso de catch (Exception ex).

Es una práctica mucho mejor tratar de detectar las Excepciones específicas que son posibles primero y, si es necesario, capturar la Excepción genérica. por ejemplo:

try{ 
    MyMethod(obj); 
}catch (NullReferenceException ne){ 
    //do something 
} 
catch(UnauthorizedAccessException uae){ 
    //do something else 
} 
catch(System.IO.IOException ioe){ 
    //do something else 
} 
catch(Exception){ 
    //do something else 
} 
+0

Obtendrá el CA2201 con este código también ya que no se supone que NullReferenceException y Exception at leat sean utilizados por algo más que el tiempo de ejecución. – Louhike

1

Las otras respuestas están muy bien para la resolución rápida, pero lo ideal si usted sabe en tiempo de compilación que un determinado método no debe ser invocado usando ciertos parámetros, puede evitar que vuelva a suceder al heredar el tipo personalizado , lo instancia solo cuando ese bool personalizado es verdadero, y ahora su método se parece a.

public void RunBusinessRule(MyInheritedType inheritedObject) 
{ 
    //No need for checks, this is always the right type. 
    //As a matter of fact, RunBusinessRule might even belong to MyInheritedType. 
} 

Este es el I en SOLID.

+0

+1 para pruebas de apoyo y utilizando buena teoría –

1

Creo que debe evitar excepciones para la lógica del código.

que sugieren que modificar su método para devolver el resultado de su método como un tipo bool entonces puede decidir la forma adecuada de mostrar un mensaje de error al usuario en el momento de llamar al método:

public bool RunBusinessRule(MyCustomType customType) 
{ 
    try 
    { 
     if (customType.CustomBoolProperty == true) 
     { 
      DoSomething(); 
      return true; 
     } 

     return false; 
    } 
    catch(Exception) 
    { 
     throw; 
    } 
} 
Cuestiones relacionadas