我有一個方法UpdateSQL()可能會因為兩個或多個不同的不相關原因拋出相同型別的例外 (SqlException)。執行時原因 1 =“無效的連接字串” sqlConn.open()。原因 2 =“執行存盤程序時出錯”執行sqlCommand.ExecuteNonQuery(). 如何確定在呼叫方方法中拋出 SqlException 的原因,以便我可以記錄自定義原因?
呼叫方法
try
{
UpdateSQL();
}
catch(SqlException e)
{
// How do i know the reason for which exception was thrown so I could log
log.LogError(e, "Reason");
}
更新方法——
UpdateSQL()
{
using (var sqlConn = new SqlConnection("myConnString"))
{
sqlConn.Open(); // May throw exception for reason 1
SqlCommand sqlCommand = new SqlCommand("myStoredProcedure", sqlConn);
sqlCommand.CommandType = CommandType.StoredProcedure;
// Some random parameter
SqlParameter myParam = sqlCommand.Parameters.AddWithValue("@Time", "3/10/2015 2:15:10 AM");
myParam.SqlDbType = SqlDbType.NVarChar;
sqlCommand.ExecuteNonQuery(); // May throw exception for reason 2
}
}
我可以看到的一種可能的方法是在 Update 方法中將兩個 Sql 命令本身包裝在單獨的 try-catch 塊中。但是有沒有辦法避免這種情況?
uj5u.com熱心網友回復:
特別是在日志記錄方面,我會避免執行任何自定義邏輯,SqlException而只是親自記錄錯誤訊息 錯誤編號以進行查找。不這樣做的原因是因為日志記錄應該相對簡單,您不應該撰寫必須進一步測驗的邏輯。
通常只記錄類似于檔案共享的內容。這是我通常在日志中使用的更精簡的版本。
Logger.Log(String.Join(Environment.NewLine,
exception.Errors.Select( (error, i) => $"Error [{i}]: {Error.Message} : Error Number {error.Number}" ));
如果您需要執行實際的業務邏輯,除了非常明確并使用錯誤編號直接根據錯誤編號或錯誤編號范圍分支到不同的邏輯之外,并沒有真正的好方法來處理此問題。像這樣的事情應該可以相當好地完成這項作業。
try
{
// do Sql stuff here
}
catch(SqlException sqlException) when (e.Errors.Select(e => e.Number).Contains(new []{25})
{
// Log Something about bad connection string..
// it happens to be 25 from what I've seen
// which tbh I cant find the docs for :(
}
catch(SqlException sqlException) when (e.Errors.Select(e => e.Number).Contains(new []{1,2,3})
{
// Log Some other kind of Error
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/391891.html
