我正在尝试完成家庭作业,但我不确定下一步该做什么。我一直在努力处理继承和异常处理……这个问题结合了两者。 你能给我一个正确的方向吗?
问题如下: 为彼得曼出版公司创建一个名为 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/