6

私は次のコードを持っています:

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;
        }

ご覧のとおり、グローバル例外である「例外」をキャッチしています。ただし、問題は、この行finalConId = sdr.GetString(0)が実行されるたびに、システムがSystem.Data.SqlTypes.SqlNullValueExceptionをスローすることです。はい、データベースの対応するフィールドにNULL値がある場合は、必ずスローします。しかし、私が欲しいのは、この例外がcatchブロックによってキャッチされ、関数が関数の開始時に宣言されたNULLであるfinalConIdのデフォルト値を返す必要があることです。しかし、これは発生していません。代わりに、エラーページが表示されます。私はこの関数を次のように呼び出しています:

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

if (conid == null)
{ /*---some code---*/}
else
{/*---some code---*}

この例外の処理方法を教えてください。

4

4 に答える 4

9

必要がないときは、例外をキャッチしないでください。sdr.IsDBNull(0)これを行う適切な方法は、 を呼び出す前にテストすることsdr.GetString(0)です。IsDBNull()true を返す場合はGetString()、例外がスローされるため、呼び出してはなりません。

また、何らかのエラーを示さずにすべての例外を飲み込むこと は、非常に悪い習慣です。catch { }またはcatch (Exception) { }、ほとんどすべての場合に回避する必要があります。壊滅的な事態が発生した場合 (たとえば、DB 接続がダウンした場合)、その例外が伝播できるようにする必要があります。それ以外の場合、呼び出し元は「その列の null 値」と「データベース接続が切断された」のケースをどのように区別しますか?

于 2012-11-27T07:17:09.547 に答える
2

このようにDBNull.ValueまたはIsDBNull()で値を確認することをお勧めします

if (reader.IsDBNull(0) && sdr.GetString(0).Equals("none") == false)
          //sdr.GetString(0)!=DBNull.Value)

このようにするよりも例外時にnullを返したい場合

string conid;
try
{
  conid = getFinalCon(Request["id"].ToString());
}
Catch(Exception ex)
{
  conid =null;
}
于 2012-11-27T07:15:46.017 に答える