在写N层结构应用程序时候经常得涉及到层次间方法的调用.调用具有返回值的方法时,象方法A调用方法B,正常情况下方法B应该返回正常值,但若是方法B找不到满足方法A的结果集或是有异常情况发生,这时我们一般采用特殊值来返回,以来标示方法B返回的不是正常值,然后在方法A中根据B中返回的特殊值做相应的处理.
对于这种情况,我们要在方法A和方法B中同时做处理,返回的这个特殊值是方法A和方法B的共同约定值,两个方法约定好在异常或没预料情况发生时方法B应该返回什么值,同时方法A也应该知道这个值是什么,因为它需要知道当方法B返回给它这个值时预示着什么问题发生,然后再做相应处理.这样处理的话你会发觉这两方法联系太紧密了,如果很多方法间都这样处理,这样的话层次间藕合度也加大了, 这并不是我们期望看到的.
我们可以考虑用自定义异常来解决这样问题,参考了 宝玉的 Asp.Net Forums中的自定义异常类 .自定义一个异常类CustomException,在处理上面提到情况时,只要在方法B中抛出CustomException(type)异常,在方法A中catch这个异常,然后通过调用这个被catch异常的message属性就可以获知我们自定义的异常信息并把它展示给最终用户.而且通过使用这种方法,你也会发觉有些原本需要返回值的方法现在不需要了,象是有些方法是用来向数据库中添加数据,一般我们会在添加成功后返回true,添加失败返回false.但用自定义异常后,只需要在添加失败后抛出一个CustomException(type),然后在适当地方catch就可以了,免去返回值和一些判断返回值的逻辑.
很多人可能会对这样做带来的性能问题有所顾虑,Applied Microsoft.Net Framework Programming中这样提到异常处理和常用的异常报告(HRESULT,特殊返回值代码,等等)之间的性能差别.里面说"比较异常处理和常用的异常报告(HRESULT,特殊返回值代码,等等)之间的性能差别通常是很困难的.如果在每次方法调用时我们都要自己编写代码来检查它们的返回值,并将其返回给调用者,那么我们的应用程序性能将会受到严重的影响.就算不考虑性能,我们必须为此编写的额外代码和潜在的错误也会大幅度增加.异常处理相对来说则是一种更好的选择".
对于这种情况,我们要在方法A和方法B中同时做处理,返回的这个特殊值是方法A和方法B的共同约定值,两个方法约定好在异常或没预料情况发生时方法B应该返回什么值,同时方法A也应该知道这个值是什么,因为它需要知道当方法B返回给它这个值时预示着什么问题发生,然后再做相应处理.这样处理的话你会发觉这两方法联系太紧密了,如果很多方法间都这样处理,这样的话层次间藕合度也加大了, 这并不是我们期望看到的.
我们可以考虑用自定义异常来解决这样问题,参考了 宝玉的 Asp.Net Forums中的自定义异常类 .自定义一个异常类CustomException,在处理上面提到情况时,只要在方法B中抛出CustomException(type)异常,在方法A中catch这个异常,然后通过调用这个被catch异常的message属性就可以获知我们自定义的异常信息并把它展示给最终用户.而且通过使用这种方法,你也会发觉有些原本需要返回值的方法现在不需要了,象是有些方法是用来向数据库中添加数据,一般我们会在添加成功后返回true,添加失败返回false.但用自定义异常后,只需要在添加失败后抛出一个CustomException(type),然后在适当地方catch就可以了,免去返回值和一些判断返回值的逻辑.
很多人可能会对这样做带来的性能问题有所顾虑,Applied Microsoft.Net Framework Programming中这样提到异常处理和常用的异常报告(HRESULT,特殊返回值代码,等等)之间的性能差别.里面说"比较异常处理和常用的异常报告(HRESULT,特殊返回值代码,等等)之间的性能差别通常是很困难的.如果在每次方法调用时我们都要自己编写代码来检查它们的返回值,并将其返回给调用者,那么我们的应用程序性能将会受到严重的影响.就算不考虑性能,我们必须为此编写的额外代码和潜在的错误也会大幅度增加.异常处理相对来说则是一种更好的选择".
下面还只是简单实现错误信息提示,还没有异常修复或回滚.只是起个抛砖引玉.更多的以后还会继续下去.
CustomException.cs
CustomException.cs
![ExpandedBlockStart.gif](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![ContractedBlock.gif](/Images/OutliningIndicators/ContractedBlock.gif)
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
![ExpandedBlockEnd.gif](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
![None.gif](/Images/OutliningIndicators/None.gif)
![ExpandedBlockStart.gif](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![ContractedBlock.gif](/Images/OutliningIndicators/ContractedBlock.gif)
![dot.gif](/Images/dot.gif)
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![ContractedSubBlock.gif](/Images/OutliningIndicators/ContractedSubBlock.gif)
![dot.gif](/Images/dot.gif)
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
![ExpandedSubBlockEnd.gif](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![ContractedSubBlock.gif](/Images/OutliningIndicators/ContractedSubBlock.gif)
![dot.gif](/Images/dot.gif)
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
![ExpandedSubBlockEnd.gif](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![ContractedSubBlock.gif](/Images/OutliningIndicators/ContractedSubBlock.gif)
![dot.gif](/Images/dot.gif)
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
![ExpandedSubBlockEnd.gif](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![ContractedSubBlock.gif](/Images/OutliningIndicators/ContractedSubBlock.gif)
![dot.gif](/Images/dot.gif)
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![ContractedSubBlock.gif](/Images/OutliningIndicators/ContractedSubBlock.gif)
![dot.gif](/Images/dot.gif)
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
![ExpandedSubBlockEnd.gif](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![ExpandedSubBlockEnd.gif](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![ExpandedBlockEnd.gif](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
BlogExceptionType枚举
![None.gif](/Images/OutliningIndicators/None.gif)
![ExpandedBlockStart.gif](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![ContractedBlock.gif](/Images/OutliningIndicators/ContractedBlock.gif)
![dot.gif](/Images/dot.gif)
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
![ExpandedBlockEnd.gif](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
XmlMessageMananger.cs
![ExpandedBlockStart.gif](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![ContractedBlock.gif](/Images/OutliningIndicators/ContractedBlock.gif)
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
![ExpandedBlockEnd.gif](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
![None.gif](/Images/OutliningIndicators/None.gif)
![ExpandedBlockStart.gif](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![ContractedBlock.gif](/Images/OutliningIndicators/ContractedBlock.gif)
![dot.gif](/Images/dot.gif)
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![ContractedSubBlock.gif](/Images/OutliningIndicators/ContractedSubBlock.gif)
![dot.gif](/Images/dot.gif)
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![ContractedSubBlock.gif](/Images/OutliningIndicators/ContractedSubBlock.gif)
![dot.gif](/Images/dot.gif)
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![ContractedSubBlock.gif](/Images/OutliningIndicators/ContractedSubBlock.gif)
![dot.gif](/Images/dot.gif)
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
![ExpandedSubBlockEnd.gif](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![ExpandedSubBlockEnd.gif](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
![ExpandedSubBlockEnd.gif](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![ExpandedBlockEnd.gif](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
message.xml
![None.gif](/Images/OutliningIndicators/None.gif)
![None.gif](/Images/OutliningIndicators/None.gif)
![None.gif](/Images/OutliningIndicators/None.gif)
![None.gif](/Images/OutliningIndicators/None.gif)
![None.gif](/Images/OutliningIndicators/None.gif)
![None.gif](/Images/OutliningIndicators/None.gif)
![None.gif](/Images/OutliningIndicators/None.gif)
![None.gif](/Images/OutliningIndicators/None.gif)
![None.gif](/Images/OutliningIndicators/None.gif)
![None.gif](/Images/OutliningIndicators/None.gif)
![None.gif](/Images/OutliningIndicators/None.gif)
![None.gif](/Images/OutliningIndicators/None.gif)
![None.gif](/Images/OutliningIndicators/None.gif)
![None.gif](/Images/OutliningIndicators/None.gif)
![None.gif](/Images/OutliningIndicators/None.gif)
![None.gif](/Images/OutliningIndicators/None.gif)
![None.gif](/Images/OutliningIndicators/None.gif)
![None.gif](/Images/OutliningIndicators/None.gif)
![None.gif](/Images/OutliningIndicators/None.gif)
![None.gif](/Images/OutliningIndicators/None.gif)
![None.gif](/Images/OutliningIndicators/None.gif)
![None.gif](/Images/OutliningIndicators/None.gif)
![None.gif](/Images/OutliningIndicators/None.gif)
![None.gif](/Images/OutliningIndicators/None.gif)
![None.gif](/Images/OutliningIndicators/None.gif)
![None.gif](/Images/OutliningIndicators/None.gif)
![None.gif](/Images/OutliningIndicators/None.gif)
![None.gif](/Images/OutliningIndicators/None.gif)
![None.gif](/Images/OutliningIndicators/None.gif)
如果自定义异常类中定义了新的字段,我们必须让其实现ISerializable接口的GetObjectData(SerializationInfo info,StreamingContext context)方法和一个特殊的受保护的构造器CustomException(SerializationInfo info,StreamingContext context).其中GetObjectData()方法用来序列化新定义字段以及基类(ApplicatonException)定义的字段,而特殊构造器是为反序列化新定义的字段和基类定义字段。
象是CustomException类中若定义一个新字段field1.我们应该在CustomException类中实现GetObjectData方法和CustomException(SerializationInfo info,StreamingContext context)构造器.
private
string field1;
// 序列化
public
override
void
GetObjectData(SerializationInfo info,StreamingContext context)
![ExpandedBlockStart.gif](/Images/OutliningIndicators/ExpandedBlockStart.gif)
{
info.AddValue("Field1",field1);
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
base.GetObjectData(info,context);
}
![None.gif](/Images/OutliningIndicators/None.gif)
//
反序列化
protected
CustomException(SerializationInfo info,StreamingContext context):
base
(info,context)
![ExpandedBlockStart.gif](/Images/OutliningIndicators/ExpandedBlockStart.gif)
{
field1=info.GetString("Field1");
}
![None.gif](/Images/OutliningIndicators/None.gif)
// 序列化
![None.gif](/Images/OutliningIndicators/None.gif)
![ExpandedBlockStart.gif](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![ContractedBlock.gif](/Images/OutliningIndicators/ContractedBlock.gif)
![dot.gif](/Images/dot.gif)
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
![ExpandedBlockEnd.gif](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
![None.gif](/Images/OutliningIndicators/None.gif)
![None.gif](/Images/OutliningIndicators/None.gif)
![None.gif](/Images/OutliningIndicators/None.gif)
![ExpandedBlockStart.gif](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![ContractedBlock.gif](/Images/OutliningIndicators/ContractedBlock.gif)
![dot.gif](/Images/dot.gif)
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
![ExpandedBlockEnd.gif](/Images/OutliningIndicators/ExpandedBlockEnd.gif)