继承和异常处理
本文关键字:异常处理 继承 | 更新日期: 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);
}