0

按照书中的示例,得到以下稍微修改的代码:

 class OutOfHoneyException : Exception
 {
    public OutOfHoneyException(string message) :base(message){}
 }

    class HoneyDeliverSystem
    {
        public void FeedHoneyToEggs()
        {
            if (true)
            {
                throw new OutOfHoneyException("This hive is Out Of Honey");
            }
        }
    }

.....................................

 HoneyDeliverSystem delivery = new HoneyDeliverSystem();

      try
        {
            delivery.FeedHoneyToEggs();
        }
        catch (OutOfHoneyException ex)
        {

            Console.WriteLine(ex.Message);
        }

我的理解是,当我们在特定条件下抛出特定异常时,相应的 catch 块会处理它。

但是请帮我举一个更好的例子,也许.NET异常的实现会很有帮助。

为什么我们将消息传递给基Exception类?是否仅用于打印目的?

子类调用基类构造函数有一个 OOPS 概念。您能否命名它以及它与自定义异常示例的关系?

4

4 回答 4

1

最好的办法是将您的新异常放入它自己的文件中并公开。基Exception类有 4 个构造函数,在大多数情况下,至少实现前 3 个构造函数会很有用:

public class OutOfHoneyException : Exception
{
    public OutOfHoneyException()
        : base()
    {
    }

    public OutOfHoneyException(string message)
        : base(message)
    {
    }

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

    public OutOfHoneyException(SerializationInfo info, StreamingContext context)
        : base(info, context)
    {
    }
}

您从Exception该类继承,因为它具有处理自定义异常时预期的所有基本异常实现/行为。

您需要实现所有 4 个构造函数,以使您的新自定义异常感觉更像是典型的 .NET 异常。

在学习有关异常的知识时要注意两件事,首先应仅针对异常行为抛出异常,其次不应使用异常来控制程序流。这两条规则很适合。

例如,如果您正在查询库存控制系统以查看库存中有多少罐豆,那么结果为 0 将是一个常见的答案,尽管这对客户来说不是一个理想的答案,但这并不例外。如果您在库存系统中查询豆罐头,但数据库服务器不可用,那么这是您所期望的常见结果之外的异常行为。

于 2013-03-02T11:23:31.757 回答
1

你离常见的做法并不遥远。我会这样做:

class OutOfHoneyException : Exception {
  public OutOfHoneyException() : base("This hive is Out Of Honey"){}
}

class HoneyDeliverSystem {
  public void FeedHoneyToEggs() {
    throw new OutOfHoneyException();
  }
}

我的意思是,没有理由为 a 提供不同的信息OutOfHoneyException,是吗?

于 2013-03-02T10:43:46.780 回答
0

When you pass the message to the base class(Exception), the base class will set Message property of your exception and do all helpful stuff like keeping StackTrace.

So when you catch your custom exception (OutOfHoneyException), the message field will be set by your base Exception class. Checkout the following code from implementation:

/// <summary>
/// Initializes a new instance of the <see cref="T:System.Exception"/> class with a specified error message.
/// </summary>
/// <param name="message">The message that describes the error. </param>
public Exception(string message)
{
  base..ctor();
  this.Init();
  this._message = message;
}

/// <summary>
/// Initializes a new instance of the <see cref="T:System.Exception"/> class with a specified error message and a reference to the inner exception that is the cause of this exception.
/// </summary>
/// <param name="message">The error message that explains the reason for the exception. </param><param name="innerException">The exception that is the cause of the current exception, or a null reference (Nothing in Visual Basic) if no inner exception is specified. </param>
public Exception(string message, Exception innerException)
{
  base..ctor();
  this.Init();
  this._message = message;
  this._innerException = innerException;
}
于 2013-03-02T10:46:48.073 回答
0

而不是写一个答案告诉你如何创建一个例外,我将尝试回答你的具体问题。

为什么我们将消息传递给基类 Exception ?是否仅用于打印目的?

或多或少。该消息是为异常添加上下文。抛出 OutOfHoneyException 可能有几个原因 - 蜜蜂睡着了,它们正在度假,食蚁兽用尽了蚂蚁并决定改为喜欢蜜蜂,等等。

子类调用基类构造函数有一个 OOPS 概念。您能否命名它以及它与自定义异常示例的关系?

无论您在派生类上使用哪个构造函数,默认构造函数将始终在基类上调用,除非您指定不同的构造函数(这就是这里发生的情况)。这是基本的构造函数重载,它在创建派生类时为您提供了合理的灵活性(另请注意,存在构造函数链接)。

于 2013-03-02T11:18:04.980 回答