此文章是给多层开发的人使用的,小型代码,或者不理解多层开发的朋友,请绕道.
多层开发已经很普遍,最少有2层.
1:表现层(显示数据,图形处理,等等)
2:处理层(逻辑处理,具体执行操作)
或者可以分得更细,具体问题具体分析嘛.
但是,在多层中,总是会有错误发生,大多数错误都是可以捕捉到的,或者是已经知道会发生的.
那么,如果在某一层抛出异常,怎么办?难道像某些人说的一层一层向上递归,最后在显示层显示?
这当然是不现实的!
当然,代码包括2部分:1健壮的代码 2:怀疑的代码
健壮的代码意思是:出错的几率很低,几乎不可能出错
怀疑的代码意思是:可能会在某种情况下出错,比如数据库连接,谁知道什么时候数据库会出现问题呢.
(1)我可以这么设计,一个模块,专门处理异常,或者一个类专门处理异常.
那这个异常类本身如果出现问题,那只能忽略.
如果异常类本身出现异常,如果不忽略,那就会调用自身,自身异常反复调用直到堆栈益出.
所以:总结一点,错误处理类(模块)必须健壮,并且一但本身出错,忽略,不能再次调用本身的错误处理功能.
(2)那么,这个处理类该怎么写呢?
1:处理类 public class Exeception{} //专门用于处理错误
2:错误消息 public class ExeceptionMessage{} //用于描述错误信息,和错误类型
但这里有个问题,处理类太死板了.而且一般错误处理类是写在程序的最底层的.
程序的层之间是单向的,不能出来依赖调用问题.(高层调用底层,底层不能调用高层)
所以,按这个逻辑,这个错误处理类如果写在底层,如何让高层的显示层显示呢?
那怎么办?事件委托就可以OK了.(具体事件可以在程序加载时由显示层注入)
我大概说一下方案,具体实现要你们自己实施.(当然我写的比较粗糙)
//错误消息
public class ExeceptionMessage
{
public string Name;//错误名称
public string Source;//错误来源
public string Message;//错误具体的描述
public int Leave;//错误等级,比如-1表示必须停止程序,0表示警告 1表示提示.
}
//-->在这里,先写事件,因为过后会要用到
//错误参数,事件用到的函数参数
public class ExeceptionEventArgs:EventArgs//必须从EventArgs继承.
{
public ExeceptionMessage ExeceptionMessage;
public ExceptionEventArgs(){}//默认构造
//构造并给一个值给成员 ExeceptionMessage 以便参数传递
public ExeceptionEventArgs(ExeceptionMessage m)
{
ExeceptionMessage=m;
}
}
//定义错误委托声明(参数就是上面刚刚申明的)
public delegate void ExeceptionEventHandle(ExeceptionEventArgs e);
//主要的东西来了,这就是错误处理主程序
//我写的比较简单,大家可以自由发挥
public class Exeception
{
//委托事件实例,就是那个delegate建出来的,但实例时,必须用event
//建了这个,就会出现类似OnClick+=那种闪电类型,嘿嘿
public event ExeceptionEventHandle OnExeception;
//处理主函数
public void ThrowExeception(ExeceptionMessage m)
{
//这里省略,你可以写一些自己的基本代码
//....比如你可以建一个错误列表等等,随你
if(m!=null && OnExeception!=null)//检查错误消息是否为空&错误事件是否为空
{
//调用刚才建立的委托实例.
OnExeception(new ExeceptionEventArgs(m));
//这里看等级,看看要不要终止程序
if(m.Leave==-1)
{
........//程序停止代码
}
}
else{.......//如果传来的错误消息有问题,忽略(我在这故意这么写的)}
}
}
这样一个简单的错误处理就出来了,当然,这个模型本身没有任何的处理事件
事件要靠注入(我用了注入这个名字,因为我觉得更恰当些)
如何使用呢?
在整个程序初始化过后,或者某个自己认为恰当的地方,把某个函数注入进去
//打比方在主函数注入.
//注意:前提是错误处理类是一个静态函数.(当然我写的不是静态的,你可以改)
//程序就一般只有一个错误处理模块,可以写成静态的.
public static void Main()
{
//这里就可以注入一个与错误处理类无关的显示函数了.
//这就实现了错误处理与表现无关的问题.
//你可以在任何的层抛出异常,并由表现层来显示.
Exeception.OnExeception+=new ExeceptionEventHandle(.....);
}
此文章只是一个简单的委托程序,起到抛砖引玉的作用,希望对有些人有些启发.