gpt4 book ai didi

c# - 使用 IDisposable 时将 try/catch 放在哪里

转载 作者:太空狗 更新时间:2023-10-29 22:20:11 24 4
gpt4 key购买 nike

有人建议我将整个 using block 放在 try 中,否则 using 范围将阻止异常被捕获。但是,如果抛出异常,这不会阻止 using 正确处理其资源吗?如果我有下面的代码,我应该把 try block 放在哪里?

using (connSQL = new SqlConnection(strConn)) 
{
connSQL.Open();
using (SqlCommand commSQL = new SqlCommand(strPreparedStatement, connSQL))
{
if (sqlParameters != null)
{
for (int i = sqlParameters.GetLowerBound(0); i <= sqlParameters.GetUpperBound(0); i++)
{
commSQL.Parameters.Add(sqlParameters[i]);
}
}
drSQL = commSQL.ExecuteReader();
dtReturn.Load(drSQL);

commSQL.Parameters.Clear();
}
}

在此应用程序中,确保与数据库的连接不会因异常而开始累积更为重要。

最佳答案

using语句将已经阻止连接累积——它通过有效地成为一个 try 来为你做清理工作。/finally通过调用 Dispose 来阻止在finally堵塞。如果你想要try/catch block ,你可以把它放在里面或外面——但你确定它不应该放在更高的层次上吗?您实际上希望如何处理异常?

顺便说一句,不清楚为什么要在命令即将被处理时从命令中清除参数...

我鼓励您在 using 中声明变量语句,这样您就不会最终尝试在 block 外读取它们:

using (SqlConnection connSQL = new SqlConnection(strConn)) {

一般来说,更愿意为您的变量提供尽可能窄的范围。哦,还有你的SqlDataReader应该在 using 中声明也。这可能并不重要,因为您无论如何都要关闭连接和命令,但我会把它作为一个原则 - 它实现了 IDisposable ,所以你应该处理掉它。

哦,还有你迭代 sqlParameters 的方式目前相当冗长。 foreach使它更简单,即使没有我也会使用 for (int i = 0; i < sqlParameters.Length; i++)除非我有理由相信它不是一个“简单”数组。

所以,我的等效代码看起来像这样:

using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
using (SqlCommand command = new SqlCommand(strPreparedStatement, connection))
{
if (sqlParameters != null)
{
// If sqlParameter is an array, you can just use
// command.Parameters.AddRange(sqlParameters) instead
foreach (SqlParameter parameter in sqlParameters)
{
command.Parameters.Add(parameter);
}
}
using (SqlDataReader reader = command.ExecuteReader())
{
DataTable table = new DataTable();
// Perform any extra initialization here
table.Load(reader);
return table;
}
}
}

关于c# - 使用 IDisposable 时将 try/catch 放在哪里,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7912294/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com