浏览器大全:是一个提供流行浏览器教程、在线学习分享的学习平台!

一个扑克游戏的诞生---扑克牌及相关类代码兼谈异常(上)

一个扑克游戏的诞生---扑克牌及相关类代码兼谈异常

 呵呵,真得很高兴上篇帖子发了以后马上有一个叫ide的朋友对我画的uml图提出了批评,这是我最希望看到的,希望这位ide网友能够继续就这个问题继续指教我一下,呵呵。另外我还是想强调一下,写这篇文章并不是为了给大家做教程,而是希望大家看到我做这个游戏当中从设计到最后完成的设计思路及编程方法,而我做这个游戏也仅仅是为了学习一下.net 而已,所以我希望大家能给我提出批评意见,而不是当作什么大作来读。我也需要学习,也需要提高自己的水平,这也就是尽管我对rose不是很熟悉但我还是敢于自暴其短把我画的uml图贴出来,我不是做范例,而是在展示自己的学习成果,并且我想我所存在的问题可能就是大家初学uml时最可能犯的错误,如果通过对这些问题的讨论能够给我或其他初学uml的人有所帮助,那是最理想不过的事了。我希望大家能指出这篇文章中的错误或不合理的地方,大家共同进步,其他那些和程序设计及编码无关的问题就不在我们讨论的范围之内,所以,请告诉我为什么错,错在那里,正确的应该是怎样,而不是只是简单的说我错了或指摘我某方面的水平,那不是一种好的讨论方式。

 言归正传,继续昨天的问题。通过刚才的类图可以看到有两个前面类设计中没提到的类:CardNotFoundException和CardAlreadyExists类,这两个类都是从System.Exception类继承来的,是自定义异常类。具体代码如下:


CardNotFoudException.cs

using System;


namespace Bigeagle.Games.Cards
{
/// <summary>
/// 未找到指定card对象异常
/// <br>Author: bigeagle</br>
/// <br>Date: 2002/4/19</br>
/// <br>History: 2002/4/19</br>
/// </summary>
public class CardNotFoundException : System.Exception
{
/// <summary>
/// 牌对象
/// </summary>
private Card m_objCard ;

/// <summary>
/// 存取牌对象的属性
/// </summary>
public Card theCard
{
get
{
return this.m_objCard ;
}
set
{
this.m_objCard = value ;
}
}

/// <summary>
/// 构造函数
/// </summary>
/// <param name="a_objCard">未找到的牌对象</param>
public CardNotFoundException(Card a_objCard)
{
this.m_objCard = a_objCard ;
}

/// <summary>
/// 重载构造函数
/// </summary>
/// <param name="a_objCard">指定的牌对象</param>
/// <param name="a_strMessage">消息,调用父类构造函数使用</param>
public CardNotFoundException(Card a_objCard , string a_strMessage):base(a_strMessage)
{
this.m_objCard = a_objCard ;
//base(a_strMessage) ;
}
}//end class
}//endnamespace


file : CardAlreadyExistsException.cs

using System;
using Bigeagle.Games.Cards ;

namespace Bigeagle.Games.Cards
{
/// <summary>
/// CardAlreadyExistsException 的摘要说明。
/// </summary>
public class CardAlreadyExistsException:System.Exception
{
/// <summary>
/// 已存在的牌
/// </summary>
private Card m_objCard = new Card() ;

/// <summary>
/// 存取牌的属性
/// </summary>
public Card theCard
{
get
{
return this.m_objCard ;
}
set
{
this.m_objCard = value ;
}
}

/// <summary>
/// 构造函数
/// </summary>
/// <param name="a_objCard">牌对象</param>
public CardAlreadyExistsException(Card a_objCard)
{
this.m_objCard = a_objCard ;
}

/// <summary>
/// 重载构造函数
/// </summary>
/// <param name="a_objCard">牌对象</param>
/// <param name="a_strMessage">消息,父类用</param>
public CardAlreadyExistsException(Card a_objCard , String a_strMessage) : base(a_strMessage)
{
this.m_objCard = a_objCard ;
}
}//end class
}//end namespace

这两个类很简单,一个是牌未找到异常,另一个是牌已经存在异常。相信不用我解释大家也能看懂(唯一需要注意的是这两个类构造函数中有个调用父类有参构造函数的用法,如果不太熟悉的话可以看一下相关教程。),那么,为什么要定义这两个异常类呢,为什么不直接抛出一个普通的Exception或者干脆等系统自己来处理呢?说到这里,我想结合上述问题讲一下有关异常的问题,主要原因是在不少朋友的代码里看到有太多的错误使用异常或干脆忽略异常的问题。

为什么要使用异常以及如何使用异常教科书里都有,我就不再赘述了。现在我要说的是为什么要自定义异常。一个比较成熟的软件项目中,错误处理的代码应该占很大比例,最糟糕的使用异常的方法就是在自己的方法中添加一个空catch子句或者干脆不理他,不处理异常会造成很多问题。既然要处理异常,那就要针对不同的异常来决定不同的处理方法,而不能简单的捕捉一个Exception,这也就是为什么要自定义异常类的原因。举个简单的例子(还是关于扑克牌的),比如说我们现在要生成一副牌然后保存到数据库中,并且要求这副牌中不能有相同的两张牌,如果只是简单的捕捉一个Exception对象,那你在后边的测试纠错中很难直接定位出错的原因,而如果分别捕捉不同的异常,那可以得到丰富的可用于测试纠错的信息。


相关软件

2345加速浏览器官方版

2345加速浏览器官方版 | 56.2MB

2345加速浏览器官方版

新一代2345加速浏览器采用Chromium和IE双内核,主打极速与安全特性。基于Chromium深度定制,引入网页智能预加载技术,访问网页更快速..

QQ浏览器官方正式版

QQ浏览器官方正式版 | 49.67MB

QQ浏览器官方正式版

QQ浏览器秉承TT浏览器1-4系列方便易用的特点,但技术架构不同,交互和视觉表现也重新设计,采用Chromium内核+IE双内核,让浏览快速稳定...

百度浏览器最新版下载

百度浏览器最新版下载 | 13.3MB

百度浏览器最新版下载

q百度浏览器,是一款简洁轻快、智能懂你的浏览器。依靠百度强大的搜索平台,在满足用户浏览网页的基础上,它整合百度体系业务优势,带给用户更方便的浏览方式功能...

UC浏览器官方正式版

UC浏览器官方正式版 | 44.2MB

UC浏览器官方正式版

UC浏览器(UC Browser)是UC Mobile Limited在2004年8月开发的一款软件,分uc手机浏览器和uc浏览器电脑版。UC浏览器是全球使用量最大的第三方手机浏览器...

猎豹浏览器2022最新版下载

猎豹浏览器2022下载 | 45MB

猎豹浏览器2022最新版下载

猎豹安全浏览器对Chrome的Webkit内核进行了超过100项的技术优化,访问网页速度更快。其具有首创的智能切换引擎,动态选择内核匹配不同网页...

360安全浏览器官方版下载

360安全浏览器下载 | 21.4MB

360安全浏览器官方版下载

360安全浏览器拥有全国最大的恶意网址库,采用恶意网址拦截技术,可自动拦截挂马、欺诈、网银仿冒等恶意网址。独创沙箱技术,在隔离模式即使访问****也不会感染...