提问人:Cshitiz Dhingra 提问时间:9/13/2022 最后编辑:CharliefaceCshitiz Dhingra 更新时间:9/13/2022 访问量:264
C# .NET:嵌套的 try catch 块未正确处理异常
C# .NET: nested try catch block not handling exception properly
问:
为了演示异常处理,我故意将错误的表名和空实例放入 。内部 try 块捕获错误的表引用异常,但外部 try 块无法捕获 on 。SqlDataReader dr
SqlClient.SqlException
NullReferenceException
dr.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();
}
}
}
答:
1赞
Charlieface
9/13/2022
#1
这段代码有很多问题,很难知道从哪里开始:
- 捕捉是荒谬的:你不会得到一个,除非失败并且你抓住了 ,在这种情况下,你应该把 移到外面,然后你可以删除 .
NullReference
ExecuteReader
SqlException
catch (SqlException
catch (NullReferenceException
conn
cmd
和需要.dr
using
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();
}
评论
dr
dr = cmd.ExecuteReader();
dr.HasRows