2011-03-15 136 views
21

我目前正在学习C#,但是我被困在某些东西上,而我找不到解决方案。
我想创建自己的Exception类。如何创建一个自定义的C#异常?

这个异常被称为“InvalidNumberException”,它检查一个数是否等于5.我知道它可能看起来有点愚蠢,但我只需要了解有关创建自定义异常的想法。

到目前为止,我在MSDN上发现,用于创建例外,我需要这四个构造函数:

public class InvalidNumberException : System.Exception 
{ 
    public InvalidNumbertException() : base() { } 
    public InvalidNumberException(string message) : base(message) { } 
    public InvalidNumberException(string message, System.Exception inner) : base(message, inner) { } 

    // A constructor is needed for serialization when an 
    // exception propagates from a remoting server to the client. 
    protected InvalidNumberException(System.Runtime.Serialization.SerializationInfo info, 
     System.Runtime.Serialization.StreamingContext context) { } 
} 

,但我不知道如何实现从输入的数字在这个类中的方法或构造控制台等于5,如果不是,则会引发异常。

如果有人能帮助我,我将不胜感激。

+0

OT,你不应该自己写四个构造函数。只需实施你需要的。 ''public class InvalidNumberException:Exception {}'should should work if if you do you all-to要做的事就是抛出new InvalidNumberException();' – 2011-03-15 22:18:12

+2

值得注意的是,除非真的需要,否则不应该创建自定义异常。首先仔细想一想。请参阅http://blogs.msdn.com/b/jaredpar/archive/2008/10/20/custom-exceptions-when-should-you-create-them.aspx – 2013-01-14 13:03:07

回答

22

你并不需要所有这些构造函数。想想你正在创建的例外 - 确保int!=5

所以,我想有一个单独的构造是这样的:

public InvalidNumberException(int value) 
    : base(String.Format("Some custom error message. Value: {0}", value)) { } 

而且使用这样的:

if (number == 5) 
    throw new InvalidNumberException(number); 

你不应该包裹在一个try块。这是执行上面的代码块来监视异常代码的工作,如:

try 
{ 
    CallSomeMethodWhichChecksTheNumberAndThrowsIfNecessary(); 
} 
catch (InvalidNumberException inex) 
{ 
    // do something, print to console, log, etc 
} 

我希望这仅仅是靠在因为用于此目的的Int32.ParseInt32.TryParse方法 - 自定义异常班级不是必需的。

27

异常本身不应该检查。相反,无论你有什么代码与数字一起工作,都应该这样做。尝试是这样的:

if (number == 5) 
    throw new InvalidNumberException(); 
+0

您可能希望将该号码传递给例外显示有意义的消息。 – 2011-03-15 22:17:33

+0

他正在讨论检查例外内的号码。它显示的消息是不相关的。 – 2011-03-15 22:20:55

4

通过投掷它暗示你在某些特定情况下的程序说,它不能正常运行,必须中止异常。你这样做,像这样:

if (conditionMet) 
    throw new Exception(); 

更具体地讲,您可以像使用InvalidOperationException异常,NullReferenceException异常等更具体的例外有时你可能需要使用更加具体的异常,当你创建自己的异常类型这通过从System.Exception基础派生。将您创建的自定义异常看作是您的程序所具有的条件的容器。在你的情况下,条件是已经传递了一个无效的数字,所以你创建了一个你使用的InvalidNumberException容器,而不是上面的通用异常。

每当CLR执行您的“throw new”语句时,它将中止当前代码路径的执行,并将查找可处理该异常的catch语句。

所以,你的代码可能是这样的:

try 
{ 
    if (number == 5) 
     throw new InvalidNumberException(); 
} 
catch (InvalidNumberException e) 
{ 
    System.Console.WriteLine("Hey I got an InvalidNumberException"); 
} 
8

接受的答案是错误的!

从接受的答案:

public InvalidNumberException(int value) 
{ 
    var message = string.Format("Some custom error message. Value: {0}", value); 
    base(message, this.InnerException) 
} 

这是一个更好的方式来做到这一点:

public InvalidNumberException(int value) : base(string.Format("Some custom error message. Value: {0}", value)) { } 
+0

你能解释为什么接受的答案是错误的吗? – numaroth 2015-03-06 16:54:42

+2

已接受的答案已被编辑为使用此代码 – 2015-03-06 17:29:50

0

它不一定是真正的所有抛出的异常是错误的,这将导致放弃你应用程序 - 只要它们被捕获而不会渗透,那就是;)。

在无效号码输入的情况下,您可能会收到异常,然后提示用户他输入了无效号码,请记录有效号码的规则,并要求其重新输入号码。如果用户为数据库帐户输入了拼写错误的密码或连接字符串,并且发生了SqlException或其他可纠正的错误,则情况也是如此。

相关问题