【问题标题】:Try Catch in Async Methods在异步方法中尝试 Catch
【发布时间】:2021-02-11 05:10:45
【问题描述】:

大家好,我在下一段代码中有一个问题 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;
            }
        }
    }

编辑:

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

【问题讨论】:

  • 为什么不直接调用Fill呢?你为什么使用任务?
  • if it fails the try catch block does not handle the exception 你确定吗?你能发布一个最小的复制吗?
  • 为什么要显式关闭连接? using 块会为您处理这些问题。如果有错误,为什么要返回 null?这只会隐藏问题,并且与表中没有用户无法区分。仅在您实际将执行分支以执行其他操作的地方捕获异常。
  • 如果要在所有路径上执行某些代码,请使用try/catch/finally
  • “try catch 块不处理异常失败”——这是什么意思?你到底看到了什么?

标签: c# winforms


【解决方案1】:

实际问题

您向我们展示的那段代码实际上确实处理了await Task.Run(() =&gt; adapter.Fill(dataTable)); 抛出的错误

只要你awaitasync 方法,exception 就会被周围的try catch 块捕获。

也可以参考这个小样本https://dotnetfiddle.net/PwLEPD

使用 vs try catch

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

using 块基本上是一个try finally,它处理在using 中声明的所有资源。您的catch block 中的close 后面是using 的自动dispose(包括close)。

关于截图

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-04
    • 1970-01-01
    • 1970-01-01
    • 2013-02-28
    • 1970-01-01
    • 1970-01-01
    • 2018-12-31
    • 1970-01-01
    相关资源
    最近更新 更多