如何创建自定义C#异常?

Sto*_*men 22 c# exception

我目前正在学习C#,但我遇到了困难,我无法找到解决方案.
我正在尝试创建自己的Exception类.

该异常称为"InvalidNumberException",它检查一个数字是否等于5.我知道它看起来有点愚蠢,但我只需要了解创建自定义异常的想法.

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

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) { }
}
Run Code Online (Sandbox Code Playgroud)

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

如果有人帮助我,我会很感激.

Chr*_*nte 27

异常本身不应该进行检查.相反,无论你使用的数字代码都应该这样做.尝试这样的事情:

if (number == 5)
    throw new InvalidNumberException();
Run Code Online (Sandbox Code Playgroud)


RPM*_*984 23

你不需要所有那些构造函数.想想你所创建的例外-以确保int!=5.

所以,我会有一个像这样的构造函数:

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

并像这样使用它:

if (number == 5)
   throw new InvalidNumberException(number);
Run Code Online (Sandbox Code Playgroud)

你不应该把它包装成一个try块.代码的工作是执行上面的代码块来监视异常,例如:

try
{
   CallSomeMethodWhichChecksTheNumberAndThrowsIfNecessary();
}
catch (InvalidNumberException inex)
{
   // do something, print to console, log, etc
}
Run Code Online (Sandbox Code Playgroud)

我希望这只是靠在因为在Int32.ParseInt32.TryParse该目的的方法-不需要自定义异常类.


小智 8

接受的答案是错的!

从接受的答案:

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

这是一种更好的方法:

public InvalidNumberException(int value) : base(string.Format("Some custom error message. Value: {0}", value)) { }
Run Code Online (Sandbox Code Playgroud)

  • 已编辑接受的答案以使用此代码 (3认同)