4

10個のレジストリキーを読み取るコードがいくつかあります。値が存在しない場合、キーが存在しない場合、値がブール値でない場合などがあります。これにエラー処理を追加するにはどうすればよいですか。現在、1つの大きな試行に配置されています{} catch{} ですが、2 番目に読み取った値が失敗した場合、プログラムが catch{} にジャンプするため、残りは読み取られません。それぞれに try{} catch{} を追加できますが、もっと良い方法があると思います. これをどのように処理しますか?似たような問題に定期的に遭遇するので質問しています。私自身の解決策は、try{} catch{} を追加することです。

助けてくれてありがとう。

4

8 に答える 8

2

まず、例外を飲み込むことは一般的に悪い考えです。キーなどの存在をチェックし、存在する場合は値を返すメソッドを作成できませんか?

それが絶対に不可能な場合は、(それぞれに対して) try/catch (飲み込み) を行う単一のメソッドへの複数の呼び出しにコードをリファクタリングできます。

SomeReturnType foo = HackyMethod(first path);
SomeReturnType bar = HackyMethod(sedond path);

SomeReturnType HackyMethod(string path)
{
    try {} catch {} etc
}
于 2008-11-24T23:03:22.600 に答える
1
Dictionary<String,String> regKeys = new Dictionary<String,String>()
{
    { "Key1", String.Empty},
    { "Key2", String.Empty},
    { "Key3", String.Empty}
};

for (int i = 0; i < regKeys.Length; i++)
{
   try
   {
       regKeys[i].Value = ReadFromRegistry(regKeys[i].Key);
   }
   catch (Exception ex)
   {
      Console.WriteLine("Unable to read Key: " + regKeys[i].Key 
         + " Exception: " + ex.Message);
   } 
}
于 2008-11-24T23:16:17.787 に答える
1

レジストリ値をどのように読んでいますか? Registry クラス (Microsoft.Win32.Registry) を使用すると、次のように、レジストリ値を読み取って、値と名前のペアが存在しない場合に指定した既定値を返すことができます。

object o = Microsoft.Win32.Registry.GetValue(
    @"HKEY_CURRENT_USER\Software\Microsoft\Calc", "layout", "");

ここでの最後のパラメータは、値の名前が見つからない場合に返されるように指定されたデフォルトです。空白文字列にしましたが、これは好きなように変更できます。

于 2008-11-24T23:46:55.103 に答える
0

@Marcの答えが最善ですが、エラーが発生したレジストリキーのコレクションを含む単一の例外が絶対に必要な場合は、例外のDataプロパティを使用して確認する必要があります。このプロパティに関するMSDNドキュメントから、

Dataプロパティによって返されるSystem.Collections.IDictionaryオブジェクトを使用して、例外に関連する補足情報を格納および取得します。情報は、任意の数のユーザー定義のキー/値ペアの形式です。各キー/値ペアのキーコンポーネントは通常、識別文字列ですが、ペアの値コンポーネントは任意のタイプのオブジェクトにすることができます。

于 2008-11-25T00:11:19.670 に答える
0

値を読み取るコードを、必要な方法でエラーを処理する独自の関数にリファクタリングします。

于 2008-11-24T23:03:04.443 に答える
0

基本的に、はい、要素のセットでエラー処理を定義するのではなく、個々の要素でエラー処理を定義する必要があります。つまり、各エラーをキャッチしてプロセスを中止させたくない場合は、グループ全体ではなく、個々の要素に対してエラー処理を実行する必要があります。

于 2008-11-24T23:04:00.680 に答える
0

これは、エラーの重大度によって異なります。検索するキーの一部が欠落しているか、タイプが間違っている場合、プログラムが続行することは意味があり、有用ですか? 他のキーよりも重要なキーはありますか?

次のことをお勧めします。

  • 必要なすべてのキーを見つけ、それらを単一の try{} に入れ、致命的なエラーを報告してクリーンアップを開始する catch{} を使用します。このブロックを最初に実行します。

  • オプションのキーをすべて見つけて、それぞれを独自の try{} ブロックに配置します。これにより、回復して他のキーに進むことができます。これを簡単にするために、必要な try/catch ブロックとエラー チェックを持ち、キー名をパラメーターとして受け取るラッパー メソッドを追加できます。

于 2008-11-24T23:05:04.907 に答える
0

編集:全体を変更しました。:PI は (以前は) 構造体またはクラスを提案していましたが、現在はそれを単純な文字列コレクションに変更しています。

頭のてっぺんからいくつかの疑似コード....

public IEnumerable<string> ReadRegistryKeys()
{
    IEnumerable<string> resultList = new List<string>();
    if (string.IsNullOrEmpty(read_in_key_#1())
    {

        resultList.Add("Failed to load key 'blah'..");
    }

    if (.... read in the next key .. etc.... ) ...

    return resultList == null || resultList.Count <= 0 ? null : resultList;
}

必要に応じて、StringCollection (System.Collections.Specialized?) も使用できます。

于 2008-11-24T23:06:49.303 に答える