SqlCommand.ExecuteReader / SqlDataReader.Read 会吞下异常吗?

Does SqlCommand.ExecuteReader / SqlDataReader.Read swallow exceptions?

考虑以下代码:

namespace SqlExceptionTest
{
    using System;
    using System.Data.SqlClient;

    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                var sql =
    @"BEGIN TRY
    SELECT 1;
    THROW 50000, 'An error occured.', 1;
END TRY
BEGIN CATCH
     THROW
END CATCH
";

                using (var cnn = new SqlConnection("<totally valid connection string>"))
                using (var cmd = new SqlCommand(sql, cnn))
                {
                    cnn.Open();

                    using (var r = cmd.ExecuteReader(System.Data.CommandBehavior.SingleRow))
                    {
                        do
                        {
                            while (r.Read())
                            {
                                // do something
                            }
                        } while (r.NextResult());

                        r.Close();
                    }

                    cnn.Close();
                }

                Console.WriteLine("Code executed without any issues.");
            }
            catch
            {
                Console.WriteLine("An exception was raised");
            }
            finally
            {
                Console.WriteLine("Press any key to exit...");
                Console.ReadKey();
            }
        }
    }
}

(我知道这里的T-Sql代码没有意义,它只是为了演示目的。)

我原以为上面的代码会抛出一个 SqlException 实例,但显然它没有。相反,while 块通常循环到最后,连接关闭,程序结束。我尝试在框架 v2 上编译到 4.6,每次都得到相同的结果。

我是否有办法,仅在 .NET 中(不更改 T-Sql 代码),使用 SqlDataReader 来知道 SELECT 语句结束后发生错误吗?或者它永远迷失在 ADO.NET 的机制中?

指定 System.Data.CommandBehavior.SingleRow 允许读取结果集而不会在应用程序中抛出后续异常。 System.Data.CommandBehavior.SingleResult 提供相同的 优化