在"using"块中,如果在catch语句中发出System.Environment.Exit(0),OracleConnection是否关闭?
例:
OracleConnection oracleConnection = getOracleConnection();
using (oracleConnection)
{
try
{
oracleConnection.Open();
OracleCommand cmd = getApplicantsCmd(oracleConnection);
OracleDataReader rdr = cmd.ExecuteReader();
List<Applicant> applicants = new List<Applicant>();
while (rdr.Read())
{
Applicant applicant = new Applicant();
applicant.email = (string)rdr["GOREMAL_EMAIL_ADDRESS"];
applicants.Add(applicant);
}
return applicants;
}
catch (Exception ex)
{
Console.WriteLine("Failure getting applicant records: " + ex.Message);
System.Environment.Exit(0);
return null;
}
}
如果在查找记录时抛出异常,我希望执行停止。
有没有更好的方法来解决这个问题?
与数据库的物理连接未关闭。它只是返回到 ADO.NET 连接池以供重用。ADO.NET 保留一个连接池,以避免每次要执行 SQL 查询时打开与数据库的物理连接。您还应该将OracleCommand
和OracleDataReader
包装在using
语句中,以确保即使在发生异常时也能正确处置。
在调用 System.Environment.Exit
之后不会调用 oracleConnection
的 Dispose()
方法,即使变量被包装在 using
中。如果要确保连接已处置,请将using
放在try
/catch
内,或者不要在using
内调用System.Environment.Exit
。如果您设置了一个标志,您仍然可以退出,并在 using
语句之后对其执行操作:
var mustExit = false;
using (var oracleConnection = getOracleConnection()) {
try {
...
} catch {
Console.WriteLine("Failure getting applicant records: " + ex.Message);
mustExit = true;
}
}
if (mustExit) {
System.Environment.Exit(0);
}
是的,它是,并且不久之后就被处理掉了。
编辑:除非它被池化,并且如前所述,它将再次在池中可用。
你的问题是,如果在块中调用Environment.Exit
,是否会调用using
语句中使用的对象的Dispose
方法using
。
答案是否定的。如果调用 Environment.Exit
或 Environment.FailFast
,则进程将终止,最终阻止(隐式阻止,由语句using
产生)将不会执行。
另一方面,如果通过调用 Application.Exit
或 Application.ExitThread
退出应用,则会调用它。