首页 > 解决方案 > 在异步方法中尝试 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;
            }
        }
    }

编辑: 在此处输入图像描述

打开连接后,我模拟了互联网连接的丢失,当它填充数据表时,异常出现。说超时异常

标签: c#winforms

解决方案


实际问题

您向我们展示的那段代码实际上确实处理了由await Task.Run(() => adapter.Fill(dataTable));

只要您await使用该async方法,exception就会被周围的try catch方块抓住。

另请参阅此小示例https://dotnetfiddle.net/PwLEPD

使用 vs 尝试捕获

由于您已经在声明中声明了您SqlConnection的内容using,因此无论如何都会正确关闭/处理连接。

using 块基本上是一个try finally处理在using. 在closecatch block的后面是自动dispose(包括closeusing

关于截图

您的调试器在抛出异常时停止。这并不意味着你的 catch 块不会被击中。在其中设置一个断点,你会意识到,按下继续后,你会击中它。


推荐阅读