2012-09-06 81 views
4

可以说我想提出一些自定义例外。我想要更多。我可以为每个新例外创建一个新班级,但是有没有另外一种方法来做到这一点?如果我必须始终创建一个新课程,在哪里存储它们?它只是在项目的根文件夹中看起来不太好。何处/如何存储或处理大量自定义异常?

Ahm和另一个问题:如果某些例外情况相同,我在做什么,只是异常的名称正在改变一点点?比方说,一个例外是这样看:

[Serializable()] 
    public class ExceptionA: Exception, ISerializable 
    { 
     public ExceptionA() : base() { } 
     public ExceptionA(string message) : base(message) { } 
     public ExceptionA(string message, System.Exception inner) : base(message, inner) { } 
     public ExceptionA(SerializationInfo info, StreamingContext context) : base(info, context) { } 
    } 
} 

,另外一个是相同的,只是另一个名字:

[Serializable()] 
    public class ExceptionB: Exception, ISerializable 
    { 
     public ExceptionB() : base() { } 
     public ExceptionB(string message) : base(message) { } 
     public ExceptionB(string message, System.Exception inner) : base(message, inner) { } 
     public ExceptionB(SerializationInfo info, StreamingContext context) : base(info, context) { } 
    } 
} 

等。我真的必须创建总是一个新的类,并粘贴相同的代码?有什么建议么?

回答

7

我可以为每个新的异常创建一个新的类,但有没有另外一种方法来做到这一点?

不,没有别的办法。如果你想创建一个新的异常类型,你需要一个新的类。

在哪里存储它们?

在所有需要使用它们的代码都可访问的位置。

我在做什么,如果一些例外情况相同,只是异常的名称正在改变一点点?

是的,还需要创建一个新的类 - 虽然你可以获得从现有的异常类新的。

+0

我可以为解决方案中的异常创建一个新文件夹并将这些类存储在那里吗?这是一个好主意吗? – silla

+2

@silla - 作为解决方案文件夹项目,它们不会被编译。他们需要成为一个项目的一部分 - 如果你有一个“核心”或“基础设施”项目将是一个好地方。如果您只有一个项目,只需添加一个文件夹即可。 – Oded

1

通常,对于像这样的事情,我会创建一个单独的项目或名称空间,以使所有这些自定义异常(甚至枚举)可用于整个项目/解决方案。

这给了我一个参考点/汇编以供参考。

继续关于具有相同“外观”的异常的问题,我将创建一个基类,可以由其他异常“略有不同”的名称继承。

1

您必须每次创建新的异常,因为这是catch()如何在try ... catch块中工作以捕获特定的异常类型。但我真的很喜欢通过C#本书从CLR采取下一个办法:

public abstract class ExceptionArgs 
{ 
    public string Message { get { return string.Empty; } } 
} 

[Serializable] 
public class Exception<TExceptionArgs> : Exception, ISerializable 
    where TExceptionArgs : ExceptionArgs 
{ 

    private const String c_args = "Args"; // For (de)serialization 
    private readonly TExceptionArgs m_args; 

    public TExceptionArgs Args { get { return m_args; } } 
    public Exception(String message = null, Exception innerException = null) 
     : this(null, message, innerException) { } 

    public Exception(TExceptionArgs args, String message = null, 
     Exception innerException = null) 
     : base(message, innerException) { m_args = args; } 

    [SecurityPermission(SecurityAction.LinkDemand, 
     Flags = SecurityPermissionFlag.SerializationFormatter)] 
    protected Exception(SerializationInfo info, StreamingContext context) 
     : base(info, context) 
    { 
     m_args = (TExceptionArgs)info.GetValue(c_args, typeof(TExceptionArgs)); 
    } 

    [SecurityPermission(SecurityAction.LinkDemand, 
     Flags = SecurityPermissionFlag.SerializationFormatter)] 
    public override void GetObjectData(SerializationInfo info, StreamingContext context) 
    { 
     info.AddValue(c_args, m_args); 
     base.GetObjectData(info, context); 
    } 

    public override String Message 
    { 
     get 
     { 
      String baseMsg = base.Message; 
      return (m_args == null) ? baseMsg : baseMsg + " (" + m_args.Message + ")"; 
     } 
    } 

    public override Boolean Equals(Object obj) 
    { 
     Exception<TExceptionArgs> other = obj as Exception<TExceptionArgs>; 
     if (obj == null) return false; 
     return Object.Equals(m_args, other.m_args) && base.Equals(obj); 
    } 
    public override int GetHashCode() { return base.GetHashCode(); } 
} 

现在就能像这样的异常创建新ARGS:

public class ExceptionAExceptionArgs : ExceptionArgs 
{ 
    //may add some properties if required here 
} 

,抓住“新的异常”是这样的:

try 
{ 
    //do something here... 
} 
catch (Exception<ExceptionAExceptionArgs> ex) 
{ 
} 

我会让你编写更少的代码来创建新的异常。
请注意:如果您希望在有一个基本异常类和少量子异常的情况下创建异常分区,此方法将不起作用。
您可以将异常类放在您想要的地方,以便可以访问,但是为每个文件创建单独的文件都是很好的方法。