2011-01-06 18 views
4

私が取り組んでいるこれらの2つのメソッドがあります。 1つは節約し、1つは読み込みます。明らかにどちらも何らかのエラー処理を必要とするので、私はいくつかの "catch all handling"を実装しました。これで、次に実行されるのは、実行時にエラーが発生するコンテキストになります。このため、上記のレベルの呼び出し元でエラーを処理したいと思います。そうすれば、私はさまざまな状況に応じて異なるロジックを持つことができます。例外を上にスローすることができます

例があります。最初の実行で負荷をチェックしても失敗した場合、メモリがクリアされた可能性があると仮定できます。しかし、実行中にロードしようとすると、メモリが(正しい手段で)クリアされず、何かがアップしていると推測できます。

public void SaveToStorage(AccountCollection Collection) 
    { 
     try 
     { 
      var storage = IsolatedStorageSettings.ApplicationSettings; 
      storage["defaultCollection"] = Collection; 
      storage.Save(); 
     } 
     catch (Exception ex) 
     { 
      // Do something meaningful here 
     } 
    } 

    public AccountCollection LoadFromStorage() 
    { 
     try 
     { 
      AccountCollection collection; 
      var storage = IsolatedStorageSettings.ApplicationSettings; 
      storage.TryGetValue("defaultCollection", out collection); 
      return collection; 
     } 
     catch (Exception ex) 
     { 
      // Do something meaningful here 
     } 

     return null; 
    } 

基本的に私は、私は、呼び出し元までエラーを投げるが、それでも、元のエラーの詳細を保持することができます求めています。

EDIT:JohnとAndrewの両方が正解を出しました。 Andrewは元のクラスで他の一般的なクリーンアップをしたいので、緑のダニを手に入れます。

答えて

11

キャッチしないことについてのすべての否定的な発言に対して、彼は、例外がスローされたメソッドでいくつかアンワインディングを行いたいと述べたが、他のメソッドが何かを実行できるようにスタックを継続する。彼はただそれを再び投げるために例外をキャッチしていない、彼はいくつかのアクションを実行したい、そして再びそれを投げる。

catch (Exception ex) 
{ 
    // Do something 
    throw; 
} 

編集

私はC++としてこれを読んで、いくつかの理由で、その例外をコピーすることについての私の発言を削除しました。

+8

'throw 'はスタックトレースを含むすべての情報を保持します。私は ''例外をスローする例外がスローされますが、スタック情報を失うことは、(100%ではありませんが)かなり確信しています。 –

+0

これは正しいですか?私はすべての情報を保持することをお勧めします。 – deanvmc

+1

はい、正しいです。 'throw'を使うと、スタック情報を保持します。 'throw ex'または' throw new Exception'を実行するとその情報が失われます。 – Jan

6

例外をキャッチしないと、例外が上方向に伝播します。

これはどのように動作するのですか。どこにでもtry/catchブロックを置かないでください。実際に例外を処理する場所にのみ配置してください。

+0

私は一般的に、知って良いです、ということを知らなかったおかげで、私はそれに応じて担当者を追加しました。 – deanvmc

-2

catchブロック内にオリジナルの例外(現在のコードはex)を投げることができます。実際には、それらの関数内で例外処理をしたいかどうかによって異なります。あなたがしたくない場合は、try/catchブロックを外側に配置します(例外を処理したい呼び出し元に配置します)。

+1

-1「スロー・エックス」は物事を悪化させます。それは例外がスローの点から来たように見える。 –

0

AccountCollection()でexpectionをキャッチできないときに便利なことがあれば、それを呼び出したメソッドにバブルアップしてそこで処理させます。

+0

あなたは本当にそれをキャッチしないことを意味することを明確にしてください。 –

+0

申し訳ありません - 私が言ったことは、あなたが扱うことができない何かをつかむことはありませんでした。あなたはそれについて何かできるようになるまで、それをバブルアップさせるのが最善であるかもしれません。 – diagonalbatman

1

これは通常、キャッチされた例外をInnerExceptionプロパティで新しい例外にラップすることによって実現されます。そうすれば、あなたは、呼び出し元に、より意味のある内容と元の例外を送ることができます。

catch(Exception ex) 
{ 
    // Do something... 
    throw new MyOwnDataStorageException("message", ex); 
} 

それとも、ただ何もできないと例外が完全なコールスタックを呼び出し元に自動的に反映されます。

+0

実際には、カスタム例外をここに追加する必要は必ずしもありませんし、まったくラッピングする必要はありません。ちょうど "スローする" –

+0

それは文脈によって異なります。原因のそれは必ずしもそうではありません。 – Jan

4

あなたがしたい唯一のことは、例外再スローそれはそれはあなたが何かをして再スローにしたいならば、あなたはこの必要上向きしかし反映されますので、さえのtry/catchを持っていない方が良いですされている場合:

catch(Exception ex) 
{ 
    // Do your bit with ex 

    throw; 
} 

throwを使用すると、スタックトレースを含む例外に関するすべての情報が保持されます。

http://winterdom.com/2002/09/rethrowingexceptionsinc

+0

リンクの担当者!ありがとう – deanvmc

2

MSDNからこの例では、あなたが探しているかもしれないもののように聞こえます。

この例では、元の例外をキャッチし、アクション(この場合はコンソールに行を書き込む)をとり、オリジナルを含む新しい例外を作成してスローします。

class TestTryCatch 
{ 
    static int GetInt(int[] array, int index) 
    { 
     try 
     { 
      return array[index]; 
     } 
     catch (System.IndexOutOfRangeException e) // CS0168 
     { 
      System.Console.WriteLine(e.Message); 
      //set IndexOutOfRangeException to the new exception's InnerException 
      throw new System.ArgumentOutOfRangeException("index parameter is out of range.", e); 
     } 
    } 
} 

http://msdn.microsoft.com/en-us/library/ms173165(v=vs.80).aspx

関連する問題