继承和异常处理

本文关键字:异常处理 继承 | 更新日期: 2023-09-27 18:31:52

我正在尝试完成家庭作业,但不确定下一步该怎么做。我一直在为继承和异常处理而苦苦挣扎......这个问题将两者结合起来。你能给我一个正确的方向吗?

问题是:为 Peterman Publishing Company 创建一个名为 BookExceptionDemo 的程序。该公司已经决定,任何出版的书每页的成本都不应超过10美分。创建一个 BookException 类,其构造函数需要三个参数:字符串 Book title、双倍价格和 int 页数。创建一个错误消息,当书籍不符合价格与页码比率时,该消息将传递给 Message 属性的 Exception 类构造函数。例如,错误消息可能是:

对于晚安月亮,比率无效。...12.99 页的价格为 25 美元。

创建一个 Book 类,其中包含标题、作者、价格和页数字段。包括每个字段的属性。如果客户端程序尝试构造价格超过每页 10 美分的 Book 对象,则抛出 BookException。创建一个程序,至少创建四个 Book 对象 - 一些对象的比例可以接受,而另一些对象则不可接受的比例。捕获任何引发的异常并显示 BookException 消息。

这是我到目前为止所拥有的:

namespace BookExceptionDemo
{
    class BookException : Exception
    {
        public BookException(string title, double price, int numberPages)
             : base("For " + title + ", ratio is invalid. 'nPrice is $" + price + " for " + numberPages + " pages.") //p.470
        {
        }
    }
    class Book
    {
        public Book(string title, double price, int numberPages)  //he said this should check to see if the ratio is correct, if not, then throw exception.
        { 
        }
        public string Title { get; private set; }
        public double Price { get; private set; }
        public int NumberPages { get; private set; }
    }
    // my teacher put this here
    // but at the end of class he said the contents should be moved somewhere else?
    // Does it go in the BookException constructor? 
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                throw (new BookException("Goodnight Moon", 12.99, 25));
            }
            catch (BookException e)
            {
                Console.WriteLine(e.Message);
            }
            Console.Read();
       }
    }
}

编辑我的学校这个学期转换了编程语言,所以我进入了这个中级C#课程,没有语言的先验知识。直到过去的几节课,我都明白了大部分事情。我在困惑中感到沮丧,感到沮丧,但现在我可以诚实地说,我很高兴能更好地理解这些概念。编程真的很有趣,我真的很感谢像你这样愿意帮助别人的人。感谢大家为协助我付出的时间和精力。

这是我认为是我发布的问题的正确答案。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace BookExceptionDemo
{
    class BookException : Exception
    {
        public BookException(string title, double price, int numberPages)
            : base("For " + title + ", ratio is invalid. 'nPrice is $" + price + " for " + numberPages + " pages.")
        {
        }
    }
    class Book
    {
        public Book(string title, string author, double price, int numberPages)
        {
            if ((price / numberPages) > .1)
            {
                throw new BookException(title, price, numberPages);
            }
        }
        private string title;
        private string author;
        private double price;
        private int numberPages;

        public string Title
        {
            get
            {
                return title;
            }
            set 
            {
                title = value;
            }
        }
        public string Author
        {
            get
            {
                return author;
            }
            set
            {
                author = value;
            }
        }
        public double Price
        {
            get
            {
                return price;
            }
            set
            {
                price = value;
            }
        }
        public int NumberPages
        {
            get
            {
                return numberPages;
            }
            set
            {
                numberPages = value;
            }
        }
    }
    class Program 
    {
        static void Main(string[] args)
        {
            try
            {
                Book junglebook = new Book("Jungle Book","Kipling", 25.99, 50);   //should throw exception
            }
            catch (BookException ex)
            {
            Console.WriteLine(ex.Message);
            }
            try
            {
                Book hobbit = new Book("The Hobbit","Tolkien", 2.99, 30);   //should NOT throw exception
            }
            catch (BookException ex)
            {
                Console.WriteLine(ex.Message);
            }
            try
            {
                Book book1984 = new Book("1984","Orwell", 31.32, 15);   //should throw exception
            }
            catch (BookException ex)
            {
                Console.WriteLine(ex.Message);
            }
            try
            {
                Book guidetonetworks = new Book("Guide to Networks","Somebody", 17.56, 500);   //should NOT throw exception
            }
            catch (BookException ex)
            {
                Console.WriteLine(ex.Message);
            }
            Console.Read();
        }
    }
}

继承和异常处理

异常的概念是发生了非常糟糕的事情。太糟糕了,以至于您正在中断程序的控制流。

在这种情况下,您需要在创建书籍时(有效地)抛出验证步骤。检查需要在书籍创建时进行,因此我们将其放在构造函数中:

public Book(string title, double price, int numberPages)
{ 
    bool goodPrice = true; //Actual condition left as an exercise
    if (!goodPrice) //No good, bail!
        throw new BookException(title, price, numberPages);
}
调用

代码需要将Book构造函数的任何调用包装在try/catch中以处理此问题。请注意,引发的异常会破坏正常的控制流,立即进入 catch 块,并且控制权不会返回到 try 块。

Program类,实际上所有这些类,通常都驻留在自己的文件中,这可能是您的教师所说的通常在其他地方所暗示的。

无论如何,您

已经知道如何调用构造函数(通过实例化,您为异常做到了!现在,您只需要创建一些Book对象(其中一些具有无效参数)。使用给定的代码,Main方法对此是有意义的。

示例调用如下所示:

try
{
   Book introToC = new Book("C# is Awesome!", 10.00, 100);
}
catch (BookException ex) //Specify what we are catching!
{
   //Do something, in your case print. (Left as exercise).
}

更新

对于您关于我们为什么使用try/catch的问题.首先,我建议你问问你的导师,因为他会比我:)解释得更好。

但是,尝试将您的对象想象成实际对象,这更有意义。假设我有一个带有"点击"方法的"SuperBigButton"类。实际上,这是一个我可以按下的超级大按钮。

假设我按下了那个按钮,但我忘了打开它(在这个例子中我不是很亮)。现在,附加到按钮上的东西可以打印出错误消息,甚至什么都不做,但关键是我不知道有什么问题

最好是打我的脸,说"你没有打开它!这对我(调用代码)更有用。当然,有些模式使用bool返回值而不是异常(想到TryParse系列函数),但这就是我们使用异常的原因。我们需要能够"错误"并告诉调用代码有些东西坏了。

异常还具有中断控制流的优点,因此调用代码中依赖于给定调用成功的任何内容都不会运行(当控制移动到catch块时,它们将被跳过)。

public Book(string title, double price, int numberPages)
{
   if(price / numberPages > 0.1)
      throw new BookException(title, price, numberPages);
}