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

时间:2011-03-15 22:11:36

标签: 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) { }
}

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

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

5 个答案:

答案 0 :(得分:27)

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

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

答案 1 :(得分:23)

您不需要所有这些构造函数。考虑一下您要创建的例外情况 - 确保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方法 - 不需要自定义异常类。

答案 2 :(得分: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)) { }

答案 3 :(得分:4)

通过抛出异常,暗示您的程序在某些特定情况下表示它无法正常执行并且必须中止。你是这样做的:

if (conditionMet)
    throw new Exception();

更具体地说,您可以使用更多特定的异常,例如InvalidOperationException,NullReferenceException等。有时您可能希望使用更具体的异常,并且当您通过从基本System.Exception派生创建自己的Exception类型时。将您创建的自定义异常想象为程序所具有的条件的容器。在您的情况下,条件是传递了无效的数字,因此您创建一个InvalidNumberException容器,而不是上面的通用Exception。

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

所以你的代码看起来像:

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

答案 4 :(得分:1)

所有抛出的异常都不一定是因为导致你的应用程序中止的错误 - 只要它们没有渗透就被捕获,那就是;)。

如果号码条目无效,您可能会收到该异常,然后提示用户他输入的号码无效,请记下有效号码的规则,并要求他或她重新输入号码。如果用户输入了数据库帐户的拼写错误的密码或连接字符串并捕获了SqlException,或者出现了其他一百个可纠正的错误,则情况也是如此。