C# try-catch块中的对象
以以下代码示例为例:C# try-catch块中的对象,c#,error-handling,try-catch,C#,Error Handling,Try Catch,以以下代码示例为例: string status = "ok"; SqlCommand cmd=null; SqlTransaction trans=null; try { cmd = defs.prepquery(""); trans = cmd.Connection.BeginTransaction(); cmd.Transaction = trans; } catch (Exception ex) { status = defs.logerror("ini
string status = "ok";
SqlCommand cmd=null;
SqlTransaction trans=null;
try
{
cmd = defs.prepquery("");
trans = cmd.Connection.BeginTransaction();
cmd.Transaction = trans;
}
catch (Exception ex)
{
status = defs.logerror("initalizing sql transaction:" + ex.ToString());
return status;
}
try
{
if (oper == "submit")
{
cmd.CommandText = "update DCM_Mapping_Sessions set StatusID=2 " +
"where MappingSessionID=" + mpsid + "";
cmd.ExecuteNonQuery();
}
else if (oper == "delete")
{
// .......etc etc
}
catch(Exception ex2)
{
//rollback , close the connection
// handle the ex
}
// if everything is ok , comit the transaction and close the connection
}
所以我的问题是:当异常发生时,try块中的对象会发生什么情况?
C#是否允许我懒惰并销毁对象(销毁挂起的事务意味着回滚)并在发生异常时关闭连接
我来自C\C++背景,所以我做上述工作是为了安全,如果下面某个地方发生异常,不会以打开的事务结束 看一看
它完全符合你的要求
因此,您的代码如下所示:
try
{
//try something
}
catch(Exception ex2)
{
// handle the ex
}
finally
{
//rollback , close the connection
}
看一看
它完全符合你的要求
因此,您的代码如下所示:
try
{
//try something
}
catch(Exception ex2)
{
// handle the ex
}
finally
{
//rollback , close the connection
}
您应该正在处理/关闭连接和事务 最好的方法是将创建内容包装在一个文件中 提供方便的语法,确保正确使用IDisposable对象 本质上,
using
语句将对象的创建封装在块中,以确保正确处理
using(var cmd = defs.prepquery(""))
using(var trans = cmd.Connection.BeginTransaction())
{
}
您应该正在处理/关闭连接和事务 最好的方法是将创建内容包装在一个文件中 提供方便的语法,确保正确使用IDisposable对象 本质上,
using
语句将对象的创建封装在块中,以确保正确处理
using(var cmd = defs.prepquery(""))
using(var trans = cmd.Connection.BeginTransaction())
{
}
简短的回答是否定的
回答更长,是的,但为时已晚
这就是为什么我们有条款和区块。您负责呼叫关闭或处置
当垃圾收集器被迫为您“缓慢”地执行此操作时,它们将被关闭或处理,但在不确定的时间段内,您昂贵的资源将被不必要地浪费
这样比较好
using(var connection = defs.GetConnection())
using(var cmd = new SqlCommand())
{
cmd.Connection = connection;
switch(oper)
{
case "submit":
cmd.CommandText = "update DCM_Mapping_Sessions" +
"set StatusID=2" +
"where MappingSessionID=" + mpsid;
case "...
}
try
{
cmd.ExecuteNonQuery();
}
catch(SomeSpecificExceptionIShouldActuallyHandleHere ex)
{
...
}
}
可能的注射攻击放在一边。简短回答,否
回答更长,是的,但为时已晚
这就是为什么我们有条款和区块。您负责呼叫关闭或处置
当垃圾收集器被迫为您“缓慢”地执行此操作时,它们将被关闭或处理,但在不确定的时间段内,您昂贵的资源将被不必要地浪费
这样比较好
using(var connection = defs.GetConnection())
using(var cmd = new SqlCommand())
{
cmd.Connection = connection;
switch(oper)
{
case "submit":
cmd.CommandText = "update DCM_Mapping_Sessions" +
"set StatusID=2" +
"where MappingSessionID=" + mpsid;
case "...
}
try
{
cmd.ExecuteNonQuery();
}
catch(SomeSpecificExceptionIShouldActuallyHandleHere ex)
{
...
}
}
可能的注入攻击放在一边。try-catch块中的对象可能看起来比它们更接近。您没有使用
使用块有什么原因吗?如果mpsid
是一个字符串参数,您可以接受注入攻击。try-catch块中的对象可能比它们看起来更接近。您没有使用块有什么原因吗使用
blocks?如果mpsid
是一个字符串参数,您会受到注入攻击+1,那么如果您输入一些代码,例如打开/关闭数据库连接,来填写您的示例,就会有所帮助。@egrunin我考虑过这一点,但我已经有一段时间没有用C#编码数据库连接了,我不想给出错误的代码(来自内存)作为示例-所以我只使用了原始问题中的占位符。+1如果您输入一些代码,例如打开/关闭数据库连接,来填写您的示例,将会有所帮助。@egrunin我考虑过这一点,但我已经有一段时间没有用C#编码数据库连接了,我不想给出错误的代码(来自内存)作为示例,所以我只使用了原始问题中的占位符。