C# .NET:嵌套的 try catch 块未正确处理异常

C# .NET: nested try catch block not handling exception properly

提问人:Cshitiz Dhingra 提问时间:9/13/2022 最后编辑:CharliefaceCshitiz Dhingra 更新时间:9/13/2022 访问量:264

问:

为了演示异常处理,我故意将错误的表名和空实例放入 。内部 try 块捕获错误的表引用异常,但外部 try 块无法捕获 on 。SqlDataReader drSqlClient.SqlExceptionNullReferenceExceptiondr.hasRows

using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Exp_Handling
{
    internal class Program
    {
        static void Main(string[] args)
        {
            SqlConnection conn;
            SqlCommand cmd;
            //SqlDataReader dr;
            try
            {
                conn = new SqlConnection(@"data source=ITEM-S132712\MSSQLSERVER2019;initial catalog=Hotel;integrated security=true");
                cmd = new SqlCommand("Select * from Room_Entry1", conn);

                conn.Open();
                SqlDataReader dr = null;
                try
                {
                    dr = cmd.ExecuteReader();
                }
                catch (SqlException ex)
                {
                    Console.WriteLine("****" + ex.Message);
                }
                if (dr.HasRows)
                {
                    Console.WriteLine("DATA FOUND");
                    while (dr.HasRows)
                    {
                        Console.WriteLine(dr.GetString(0));
                    }
                }
            }
            catch (System.NullReferenceException nullExp)
            {

                Console.WriteLine("##try1###" + nullExp.Message);
                Console.WriteLine("Instance is Null for DataReader");
            }
            catch (Exception out_Ex)
            {
                Console.WriteLine("##try2###" + out_Ex.Message);
            }

            Console.ReadKey();
            }
        }
    }


参考 https://www.mssqltips.com/sqlservertip/6055/net-exception-handling-for-database-calls-to-sql-server-with-try-catch-and-finally/ 演示

C# 异常 NullReferenceException

评论

0赞 Enigmativity 9/13/2022
的实例设置在以下行上:。我不认为你会得到 NRE.drdr = cmd.ExecuteReader();dr.HasRows

答:

1赞 Charlieface 9/13/2022 #1

这段代码有很多问题,很难知道从哪里开始:

  • 捕捉是荒谬的:你不会得到一个,除非失败并且你抓住了 ,在这种情况下,你应该把 移到外面,然后你可以删除 .NullReferenceExecuteReaderSqlExceptioncatch (SqlExceptioncatch (NullReferenceException
  • conn cmd和需要.drusing
  • while (dr.HasRows)没有意义,应该while (dr.Read())
  • 不要使用 ,只选择您需要的列。SELECT *
  • 不要使用 ,而是使用列名。GetString(0)
  • 不要对连接字符串进行硬编码,而是将其存储在设置文件中
static void Main(string[] args)
{
    try
    {
        using (var conn = new SqlConnection(YourConnString))
        using (var cmd = new SqlCommand("Select SomeColumn from Room_Entry1", conn))
        {
            conn.Open();
            using (var dr = cmd.ExecuteReader())
            {
                if (dr.HasRows)
                {
                    Console.WriteLine("DATA FOUND");
                    while (dr.HasRows)
                    {
                        Console.WriteLine(dr["SomeColumn"]);
                    }
                }
            }
        }
    }
    catch (SqlException ex)
    {
        Console.WriteLine("****" + ex.Message);
    }
    catch (Exception out_Ex)
    {
        Console.WriteLine("##try2###" + out_Ex.Message);
    }

    Console.ReadKey();
}