【发布时间】:2022-12-19 13:57:43
【问题描述】:
在调试会话中,我看到在没有上下文的情况下抛出异常(“名称 ex 在当前上下文中不存在”)但是在它从 try 块返回值之后
代码看起来像这样
public async Task<int> SomeHandler(){
await using var connection = await _sqlConnectionFactory.CreateConnectionAsync();
try
{
const string sql ="..."
var sqlParams = new
{
...
};
var r = await connection.ExecuteScalarAsync<int>(sql, sqlParams);
1. -> return r; //first returns
}
catch (Exception ex)
{
2. -> throw new Exception("log message", ex); // Debugger hits and my QuickWatch says 'the name ex does not exist in the current context'
}
}
CreateConnectionAsync 是“一路向下”的异步,SomeHandler 也被称为 async'ly。
然后我读了这个
“您可以实例化资源对象,然后将变量传递给 using 语句,但这不是最佳实践。在这种情况下,在控制离开 using 块后,该对象仍然在范围内,但可能无法访问其非托管资源。”
因此,只是为了它,我尝试在 using 中建立连接。
像这样
var connection = await _sqlConnectionFactory.CreateConnectionAsync();
await using (connection) {
try {
....
异常仍在被“捕获”但仍然没有上下文(名称 ex 在当前上下文中不存在)
然后我尝试了两种不同的东西。
-
将
await using var connection = await _sqlConnectionFactory.CreateConnectionAsync();放入我的 try 块中 - 然后异常消失了 -
在我的使用中删除了等待,这也导致异常消失了。
var connection = await _sqlConnectionFactory.CreateConnectionAsync(); using (connection) { try {我对抛出的这个异常的解释是,它来自尝试处置时超出范围的数据库连接。
我在这里走错路了吗?
【问题讨论】:
-
我建议看一下连接类的 DisposeAsync 方法
-
所以这只发生在附加调试器的情况下?换句话说用 Cltr+F5 运行绝对没有问题?
-
@theemee 连接是 SqlConnection。它继承自实现 IAsyncDisposable 的 DbConnection。
-
@TheodorZoulias 是的。似乎真的没有例外,但我可以通过如上所述移动代码来激发它。所以我想是不是出了什么问题? :/
-
SqlConnection 文档还建议使用
using而不是await using,所以我想这就是你应该使用的
标签: c# async-await