2011-04-19 58 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]); 
     } 

    } 
} 

想法很简单,我想将键/值对象包含到异常的Message。此操作不能在base()事件中执行,也不能在构造函数中执行(“消息是只读的”)。自定义消息属性的继承异常类

我找到了一个解决方案,其中静态函数可以做的伎俩:

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

但我不是很满意吧! 是否有任何其他解决此类和类似的情况?

回答

10

编写异常的一般指导原则指出,您应该使用3个常见ctors编写Exception。例如:

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

我认为你只是需要工厂,它将处理用自定义消息创建异常。