根据今天下午一些朋友的提示,写出了一个简单的在 WinForm 下的异常处理机制:
1.首先定义我要处理的异常类类,如
using System;
///处理异常的名称空间
namespace ultility.cxException
{
/// <summary>
/// 数据库连接失败 的异常
/// </summary>
public class NotConnectionException : Exception
{
/// <summary>
/// 抛出的错误信息
/// </summary>
string _mess;
public new string Message
{
get
{
return _mess;
}
}
public NotConnectionException(string mess)
{
_mess = mess;
}
public NotConnectionException(){}
}
/// <summary>
/// 执行 SQL 时的错误的异常
/// </summary>
public class SqlErrorException : Exception
{
/// <summary>
/// 抛出的错误信息
/// </summary>
string _mess;
public new string Message
{
get
{
return _mess;
}
}
public SqlErrorException(string mess)
{
_mess = mess;
}
public SqlErrorException(){}
}
}
///处理异常的名称空间
namespace ultility.cxException
{
/// <summary>
/// 数据库连接失败 的异常
/// </summary>
public class NotConnectionException : Exception
{
/// <summary>
/// 抛出的错误信息
/// </summary>
string _mess;
public new string Message
{
get
{
return _mess;
}
}
public NotConnectionException(string mess)
{
_mess = mess;
}
public NotConnectionException(){}
}
/// <summary>
/// 执行 SQL 时的错误的异常
/// </summary>
public class SqlErrorException : Exception
{
/// <summary>
/// 抛出的错误信息
/// </summary>
string _mess;
public new string Message
{
get
{
return _mess;
}
}
public SqlErrorException(string mess)
{
_mess = mess;
}
public SqlErrorException(){}
}
}
2.然后在业务逻辑层使用,简化了一些代码:
void test()
{
try
{
conn.Open();
try
{ cmd.ExecuteNonQuery();
}
catch(SqlException e)
{
//由于是在执行 SQL 出现了 SqlException
//所以大部分出现 SQL 方面错误的可能性就高
//因此就抛出了 SqlErrorException ,让第一个 catch 块捕获
throw new ultility.cxException.SqlErrorException("要执行的 SQL 有误");
}
}
catch(ultility.cxException.SqlErrorException e)
{
throw new ultility.cxException.SqlErrorException(e.Message);//抛出一个新的 SqlErrorException
}
//这里我把出现 SqlException 就认为是连接不到数据库
//虽然它可能是最先发生的,但要放到最后,至于为什么 MSDN 中有解释
catch(SqlException e)
{
throw new ultility.cxException.NotConnectionException("连接数据库失败!");
}
finally
{
conn.Close();
conn.Dispose();
}
{
try
{
conn.Open();
try
{ cmd.ExecuteNonQuery();
}
catch(SqlException e)
{
//由于是在执行 SQL 出现了 SqlException
//所以大部分出现 SQL 方面错误的可能性就高
//因此就抛出了 SqlErrorException ,让第一个 catch 块捕获
throw new ultility.cxException.SqlErrorException("要执行的 SQL 有误");
}
}
catch(ultility.cxException.SqlErrorException e)
{
throw new ultility.cxException.SqlErrorException(e.Message);//抛出一个新的 SqlErrorException
}
//这里我把出现 SqlException 就认为是连接不到数据库
//虽然它可能是最先发生的,但要放到最后,至于为什么 MSDN 中有解释
catch(SqlException e)
{
throw new ultility.cxException.NotConnectionException("连接数据库失败!");
}
finally
{
conn.Close();
conn.Dispose();
}
3.这样我在客户端使用时 test() 方法时:
try
{
test();
}
//捕捉到 执行SQL错误 的异常
catch(ultility.cxException.SqlErrorException e)
{
MessageBox.Show(e.Message); //给出友好提示
}
//捕捉到 连接数据库失败 的异常
catch(ultility.cxException.NotConnectionException e)
{
MessageBox.Show(e.Message);//给出友好提示
}
{
test();
}
//捕捉到 执行SQL错误 的异常
catch(ultility.cxException.SqlErrorException e)
{
MessageBox.Show(e.Message); //给出友好提示
}
//捕捉到 连接数据库失败 的异常
catch(ultility.cxException.NotConnectionException e)
{
MessageBox.Show(e.Message);//给出友好提示
}
以上是我今天才注意到的对异常错误机制的一点点认识,肯定存在很多不成熟的地方
希望大家能提出更加成熟的异常错误机制进行学习、讨论,谢谢。