无法处理System.Data.SqlTypes.SqlNullValueException

Shi*_*eek 4 c# asp.net null sqlexception sql-server-2008

我有以下代码:

public string getFinalCon(string desid)
        {
            string finalConId = null;
            try
            {
                query = "select finalConID from discussions where desid=@did";
                com = new SqlCommand(query, con);
                com.Parameters.AddWithValue("@did", desid);
                con.Open();
                sdr = com.ExecuteReader();
                while (sdr.Read())
                {
                    if (sdr.GetString(0).Equals("none") == false && sdr.GetString(0)!=null)
                    {
                        finalConId = sdr.GetString(0);
                        break;
                    }
                }
                con.Close();
            }
            catch (Exception)
            {
            }
            return finalConId;
        }
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,我正在捕捉"异常",即全局异常.但问题是每当执行此行finalConId = sdr.GetString(0)时,系统都会抛出System.Data.SqlTypes.SqlNullValueException.是的,只要相应字段中的数据库中存在NULL值,它肯定会抛出它.但我想要的是这个异常应该被catch块捕获,并且函数应该返回默认值finalConId,该函数在启动时声明为NULL.但这不会发生,而是显示我的错误页面.我这样调用这个函数:

string conid = getFinalCon(Request["id"].ToString());

if (conid == null)
{ /*---some code---*/}
else
{/*---some code---*}
Run Code Online (Sandbox Code Playgroud)

请有人告诉我如何处理这个例外.

cdh*_*wie 7

不需要时不要捕获异常.正确的方法是sdr.IsDBNull(0)在打电话之前进行测试sdr.GetString(0).如果IsDBNull()返回true,则GetString()抛出异常而不应该调用它.

在没有指出某种错误的情况下吞下所有异常也是非常糟糕的做法. catch { }catch (Exception) { }几乎在所有情况下都应该避免.如果发生灾难性事件(例如,DB连接断开),您希望允许该异常传播.否则,调用者如何区分"该列中的空值"和"数据库连接死亡?"的情况.