2011-04-19 16 views
5
public class GroupWithSpecificOptionsNotFoundException : Exception 
{ 
    public GroupWithSpecificOptionsNotFoundException(string place, Dictionary<string, string> options) 
      : base(string.Format("Group with specific options not found, in ({0}), at ({1})", place, DateTime.Now.ToString())) 
    { 
     foreach (string key in options.Keys) 
     { 
      this.Message += string.Format("Option Name : ({0}) with Value : ({1}) not found in this group options set", key, options[key]); 
     } 

    } 
} 

La idea es simple, quiero incluir los objetos clave/valor en la excepción Message. Esta acción no se puede realizar en la cosa base(), ni dentro del constructor ("El mensaje es de solo lectura").Clase de excepción heredada con propiedad de mensaje personalizado

he encontrado una solución donde una función estática puede hacer el truco:

public class GroupWithSpecificOptionsNotFoundException : Exception 
{ 
    public static string GenerateOptionValueString(Dictionary<string, string> options) 
    { 
     string msg = string.Empty; 
     foreach (string key in options.Keys) 
     { 
      msg += string.Format("Option Name : ({0}) with Value : ({1}) not found in this group options set", key, options[key]); 
     } 
     return msg; 
    } 

    public GroupWithSpecificOptionsNotFoundException(string place, Dictionary<string, string> options) 
      : base (string.Format("Group with specific options not found ({2}), in ({0}), at ({1})", 
        place, DateTime.Now.ToString(), GroupWithSpecificOptionsNotFoundException.GenerateOptionValueString(options))) 
    { 
    } 
} 

pero no estoy muy satisfecho con él! ¿Hay alguna otra solución para este y casos similares?

Respuesta

10

Las pautas generales para escribir excepciones establece que debe escribir Excepción con 3 ctors comunes. Por ejemplo:

public class MyException : Exception 
{ 
    public MyException() 
    { 
    } 
    public MyException(string message) : base(message) 
    { 
    } 
    public MyException(string message, Exception innerException) 
     : base(message, innerException) 
    { 
    } 
} 

Creo que simplemente necesita una fábrica que se encargue de la creación de excepción con un mensaje personalizado.

Cuestiones relacionadas