c# - 继承和异常处理

标签 c# inheritance exception

我正在尝试完成家庭作业,但我不确定下一步该做什么。我一直在努力处理继承和异常处理……这个问题结合了两者。 你能给我一个正确的方向吗?

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

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

创建一个包含标题、作者、价格和页数字段的 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# 类(class)。在过去的几堂课之前,我了解了大部分内容。我对自己的困惑感到沮丧,感到沮丧,但现在我可以诚实地说,我很高兴能更好地理解这些概念。编程真的很有趣,我真的很感激像你这样乐于助人的人。感谢大家花时间和精力帮助我。

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

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 block 并且控制不会返回到 try block 。

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 的问题。首先,我建议你问问你的导师,因为他会比我解释得更好:)。

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

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

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

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

关于c# - 继承和异常处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27116677/

相关文章:

c# - ASP.NET 将所有文件下载为 Zip

c# - Unity碰撞删除然后添加回来

java - 将公共(public)父类(super class)的 Class 传递给 Function;函数应该检查对象是否是传递的类的实例

java - 嵌套资源获取是否需要在 Java 中进行特殊处理?

c# - 如何在 DataGrid 中绑定(bind)两个依赖的 ComboBox

c# - 如何将 asp.net web 应用程序连接到 kannel 短信网关?

java - 当实现违反其接口(interface)契约时抛出什么异常?

C异常处理

c++ - 从成员变量中借用值?

java - 远离 child : Removing protected fields from inheritance