【发布时间】:2010-12-03 04:49:56
【问题描述】:
使用数据库连接时何时在 ASPX 中记录错误? 在以下代码中,Pro ASP.NET 3.5 in C# 2008(第三版)的作者建议在 catch 块中记录 SQL 错误。我的问题是:
这是常见的做法吗?
这是最佳做法吗?
简而言之,关闭当前连接并完全分开处理错误会更好吗?这两种方法的优缺点是什么?
编辑添加:为了澄清问题不是应该记录(该问题已在其他地方讨论过),这个问题更具体。问题是在代码中记录的位置。应该在 catch 中完成(当连接仍然打开时)还是应该关闭当前连接并完全分开记录?不是将日志记录作为捕获的一部分添加的部分(即使它调用外部方法,该连接仍保持打开状态),直到它返回并到达“finally”。
public int InsertEmployee(EmployeeDetails emp)
{
SqlConnection con = new SqlConnection(connectionString);
SqlCommand cmd = new SqlCommand("InsertEmployee", con);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add(new SqlParameter("@FirstName", SqlDbType.NVarChar, 10));
cmd.Parameters["@FirstName"].Value = emp.FirstName;
cmd.Parameters.Add(new SqlParameter("@LastName", SqlDbType.NVarChar, 20));
cmd.Parameters["@LastName"].Value = emp.LastName;
cmd.Parameters.Add(new SqlParameter("@TitleOfCourtesy", SqlDbType.NVarChar, 25));
cmd.Parameters["@TitleOfCourtesy"].Value = emp.TitleOfCourtesy;
cmd.Parameters.Add(new SqlParameter("@EmployeeID", SqlDbType.Int, 4));
cmd.Parameters["@EmployeeID"].Direction = ParameterDirection.Output;
try
{
con.Open();
cmd.ExecuteNonQuery();
return (int)cmd.Parameters["@EmployeeID"].Value;
}
catch (SqlException err)
{
// Replace the error with something less specific.
// You could also log the error now.
throw new ApplicationException("Data error.");
}
finally
{
con.Close();
}
}
【问题讨论】:
-
一般来说,你永远不应该在 catch 块中使用“throw new”。如果您想捕捉、记录和重新抛出,只需使用“throw;”。否则,您的代码看起来不错。
标签: asp.net sql exception-handling