c# - 在异步方法中尝试 Catch
问题描述
大家好,我在下一段代码中有一个问题await Task.Run(() => adapter.Fill(dataTable)); 如果失败,try catch 块将不处理异常。我怎样才能捕捉到异常?
谢谢你。
public async Task<DataTable> GetUsersAsync()
{
using (SqlConnection sqlConnection = new SqlConnection(GetSettingsConenction()))
{
try
{
await sqlConnection.OpenAsync();
string query = "SELECT [dbo].[User].[usr_id] AS \"ID\", [dbo].[User].[usr_alias] AS \"ALIAS\", [dbo].[User].[usr_firstname] AS \"NOMBRE\", [dbo].[User].[usr_lastname] AS \"APELIIDO\", [dbo].[User].[usr_email] AS \"MAIL\", (SELECT [dbo].[UserRole].[uro_name] FROM [dbo].[UserRole] WHERE [dbo].[UserRole].[uro_id] LIKE [dbo].[User].usr_urol_id) AS \"ROL\" FROM [dbo].[User] WHERE [dbo].[User].[usr_deleted] NOT LIKE '1'";
SqlCommand sqlCommand = new SqlCommand(query, sqlConnection);
sqlCommand.CommandType = System.Data.CommandType.Text;
sqlCommand.CommandTimeout = SQL_TIMEOUT_EXECUTION_COMMAND;
SqlDataAdapter adapter = new SqlDataAdapter(sqlCommand);
DataTable dataTable = new DataTable();
await Task.Run(() => adapter.Fill(dataTable));
sqlConnection.Close();
return dataTable;
}
catch
{
sqlConnection.Close();
return null;
}
}
}
打开连接后,我模拟了互联网连接的丢失,当它填充数据表时,异常出现。说超时异常
解决方案
实际问题
您向我们展示的那段代码实际上确实处理了由await Task.Run(() => adapter.Fill(dataTable));
只要您await
使用该async
方法,exception
就会被周围的try catch
方块抓住。
另请参阅此小示例https://dotnetfiddle.net/PwLEPD
使用 vs 尝试捕获
由于您已经在声明中声明了您SqlConnection
的内容using
,因此无论如何都会正确关闭/处理连接。
using 块基本上是一个try finally
处理在using
. 在close
你catch block
的后面是自动dispose
(包括close
)using
。
关于截图
您的调试器在抛出异常时停止。这并不意味着你的 catch 块不会被击中。在其中设置一个断点,你会意识到,按下继续后,你会击中它。
推荐阅读
- security - 如何将 Nessus 用于内部网络?
- html - 无法完全缩放图像,并使用溢出:隐藏工作
- javascript - Javascript:如何在午夜刷新页面?
- vba - 无法从图像链接数组中抓取第一个图像链接
- python - Pandas 读取行和列中具有多个标题以及合并单元格的 excel 表
- c# - 如何将我的默认 GnuPG 密钥环位置更改为 Windows 操作系统中的不同位置
- coroutine - 什么证明使用协程而不是子例程是合理的?
- javascript - 如何在不更改设置的情况下在 glidejs 中居中项目
- mysql - 子字符串中的一些字符串
- javascript - Vue + axios 在值更改时不更新 DOM