0

通常のプログラムフローとしてエラー条件を使用してはならないことをどこかで読みました。私には非常に理にかなっています...しかし

MySQL データベースの上にある C# アプリケーション。文字列値を ID と値の 2 つの部分に解析する必要があります。(元のデータはデボン紀のデータベースから取得されます)、ルックアップ テーブルに対して値を検証します。したがって、元の文字列のいくつかは次のようになります。

「6776 パープルピープルイーター」

『BIK イエローポルカドットビキニ(使用中)』

「DCPデュースクーデター」

したがって、私の小さなユーティリティは、最初のスペースのインデックスに基づいて、各文字列を ID と説明に解析します (幸いなことに、一貫性があります)。次に、ID をルックアップに渡し、新しい値を取得して終了します。

残念なことに、TPTB は、悪臭を放つ黄色の水玉模様のビキニ (現在使用中) はもう必要ないと判断しました。したがって、BIK は行を返しません。コード スニペットを次に示します。

    foreach (string product in productTokens) {
      tempProduct = product.Trim();
      if (tempProduct.Length > 0) {
        if (tempProduct.Length < 10) {
          product_id = tempProduct;
        }
        else {
          int charPosition = tempProduct.IndexOf(" ");
          product_id = tempProduct.Substring(0, charPosition);
        }
        try {
          s_product = productAdapter.GetProductName(product_id).ToString();
        }
        catch (Exception e) {
          if (e.Message.ToString() == "Object reference not set to an instance of an object.") {
            s_product = "";
          }
          else {
            errLog.WriteLine("Invalid product ID " + e.Message.ToString());
            Console.WriteLine("Invalid product ID " + e.Message.ToString());
            throw;
          } //else
        } //catch
        if (s_product.Length > 0) {
          sTemp = sTemp + s_product + "; ";
        }
      } //if product.length > 0
    } //foreach product in productTokens

本当に、本当に醜い!特に、catch ブロックで無効な ID をテストする部分。これを処理するためのより良い方法が必要です。

誰かが私を助けることができれば、本当に感謝しています。

ありがとう。

4

3 に答える 3

2

その時点で ToString() を呼び出すべきではありません。まず、返された値が null かどうかを確認する必要があります。

object productName = productAdapter.GetProductName(product_id);
if ( productName != null )
{
    s_product = productName.ToString();
}
else
{
    s_product = String.Empty;
}
于 2008-12-05T23:26:13.207 に答える
1

Rob と Marc の推奨事項に加えて、上記のコードに基づいて、別の調整をお勧めします。が をまだ返してproductAdapter.GetProductName()いない場合は本当に驚きます。その場合、ToString() を呼び出すのはまったく冗長です。実際にすでに を返している場合は、try/catch ブロック全体が 1 行になります。StringString

s_product = productAdapter.GetProductName(product_id) ?? string.Empty;

また、すでにStringa -を返すものについて言及することも役立つと思いますException.Message。したがって、コード内で ToString() を呼び出しているさまざまな場所もすべて、まったく冗長です。

String.Split()また、 との組み合わせではなく、インスタンス メソッドを使用することをお勧めしIndexOfますSubString

product_id = tempProduct.Split(" ", 2)[1];

最後に、プロパティExceptionを調べてどのような種類のものを捕まえたかを判断するMessageことは、完全に最後のシナリオであるべきです. 本当にここでキャッチする必要がある場合でも、明示的に行う必要があります。NullReferenceException

catch (NullReferenceException) {
    s_product = "";
}
catch (Exception e) {
    // Log your invalid ID error condition here
}

PS: また、コードに DB API の証拠がないため、この質問が MySQL と何の関係があるのか​​ もよくわかりません。

于 2008-12-06T00:12:14.253 に答える
0

GetProductName が null を返すかどうかを簡単に確認できませんか?

var productName = s_product = productAdapter.GetProductName(product_id);
if(productName == null) { ... do something }
else {
    string name = productName.ToString();
}
于 2008-12-05T23:27:26.090 に答える