深入探讨异常
catch (SqlException ep)
{
}
比如我有这样一行代码,当数据库连接不上时,引发这个异常,我想知道的是,出现哪些错误时会引发这个异常,并且出现这个异常的时候我又可以跟据那个值来判断到底是那个错误(因为很多错误都会出现这个异常)发生,这样我就知道到底是连接不上数据库,还是sql写错了等等,我因此也可以给用户提示更详细的信息
[解决办法]
[解决办法]
比如,sqlserver暂停的时候,SqlException的Message属性会明确的告诉你 暂停的说明
[解决办法]
[解决办法]
我从不关心是什么导致了异常的发生,如果需要分清楚,请查看MSDN,上面有详细的异常说明,比如在连接打开时报错将,网络断开或服务端不可用,将引发SqlException异常,然后判断异常的详细内部信息来处理。
而实际上在使用的时候,只有需要给出内部异常InnerException的时候,才需要判断异常类型。特殊情况:Web异常需要捕获异常内容时,需要单独指明异常类型处理,否则获取不到异常内容。
[解决办法]
public class ErrorItem
{
private string _Key=string.Empty;
private string _Message=string.Empty;
public string Key
{
get{return _Key;}
set{_Key=value;}
}
public string Message
{
get{return _Message;}
set{_Message=value;}
}
}
public class AccessSqlCommand
{
//数据返回集
private DataSet _OutDataSet=new DataSet();
//数据库连接
private SqlConnection myConnection;
//数据适配器
private SqlDataAdapter mySqlDataAdapter;
public static string ErrorMessage(DataSet ds)
{
return ErrorMessage(ds,null);
}
public static string ErrorMessage(DataSet ds,ArrayList eErrorItems)
{
string sErrorMessage=ds.Tables["Exception"].Rows[0]["Message"].ToString();
sErrorMessage=sErrorMessage.Replace("\r\n","");
sErrorMessage=sErrorMessage.Replace("\n","");
if(eErrorItems!=null)
{
foreach(ErrorItem errorItem in eErrorItems)
{
if(sErrorMessage.IndexOf(errorItem.Key)!=-1)
return errorItem.Message;
}
}
return sErrorMessage;
}
#region new Property
private string _ConnectionString=ConfigurationSettings.AppSettings["ConnectionString1"];
private bool _Transaction=false;
SqlCommandCollection _SqlCommands=new SqlCommandCollection();
public string ConnectionString
{
get
{
return _ConnectionString;
}
set
{
_ConnectionString=value;
}
}
public bool Transaction
{
get
{
return _Transaction;
}
set
{
_Transaction=value;
}
}
public SqlCommandCollection SqlCommands
{
get
{
return _SqlCommands;
}
}
#endregion
#region public method
public bool Execute(out DataSet OutDataSet)
{
return ExecuteSql(out OutDataSet);
}
public bool Execute()
{
DataSet OutDataSet;
bool _bool=ExecuteSql(out OutDataSet);
OutDataSet.Dispose();
return _bool;
}
#endregion
#region private method
#region error operation method
private void AddException(string sErrCode,string sErrMessage)
{
DataTable dtException=new DataTable("Exception");
dtException.Columns.Add("Code");
dtException.Columns.Add("Message");
_OutDataSet.Tables.Add(dtException);
DataRow drException =dtException.NewRow() ;
drException["Code"]=sErrCode;
drException["Message"]=sErrMessage;
dtException.Rows.Add(drException);
}
/// <summary>
/// 处理错误信息
/// </summary>
/// <param name="e">包含错误信息对象</param>
/// <param name="myConnection">数据连接</param>
private void DealWithExceptionInfo(SqlException e,SqlConnection myConnection,string myExecuteQuery)
{
DataSet dtException=new DataSet();
if (e.Number.ToString().Trim()=="547" && (myExecuteQuery.ToUpper().IndexOf("DELETE")!=-1))
{
AddException(e.Number.ToString(),"此编码已使用,不能删除!");
return;
}
if(e.Number==50000)
AddException(e.Number.ToString(),e.Message.ToString());
else
AddException(e.Number.ToString(),e.Message.ToString()+"\n"+myExecuteQuery);
}
#endregion
private bool ExecuteSql(out DataSet OutDataSet)
{
bool error=true;
string myExecuteQuery=string.Empty;
try
{
myConnection = new SqlConnection(this.ConnectionString);
myConnection.Open();
}
catch
{
AddException("0001","数据库连接失败!");
OutDataSet=_OutDataSet ;
return false;
}
OutDataSet=_OutDataSet ;
return error;
}
#endregion
}
[解决办法]
没有试过去区分这些东西。
1. 异常信息(message)的判读,但是这个可能有点不准确吧,因为是字符串。
2. 异常出现后有ID,你可以把这些ID记录下来自己枚举下来判断是什么异常。
3. 像操作日志记录里面也会有这些出错的记录,你也可以通过某种固定的key去区分,这个就有点远了。
还是等牛人有什么方法没。
[解决办法]
上面有很多高手说的不错
1 在catch里面不做异常处理,直接throw是很不好的写法,因为throw一直网上传会很耗资源,最好直接在函数内部把catch处理了
2 exception的信息是给程序员看的,给用户看一点用没有,另外sp1234说的对,有时候exception的信息是看不到具体什么原因的,而是要是去看inner exception的信息才能看出来。
3 log4net 还是不错的选择,如果可以的话直接写到log文件里面还是很好的,程序员看到log信息应该就可以看到为什么了