2011-06-30 16 views
2

どのようにして予期される例外を処理できますか?私の他のSimplerAESクラスで例外を回避するにはどうすればいいですか

u.RowKey == new SimplerAES().Dec(HttpServerUtility.UrlTokenDecode(id))); 

:以下呼び出す

私は私のMVCコントローラのコードを持って

public string Dec(byte[] encrypted) 
    { 
     return encoder.GetString(Decrypt(encrypted)); 
    } 

    public byte[] Decrypt(byte[] buffer) 
    { 
     try { 
      MemoryStream decryptStream = new MemoryStream(); 
      using (CryptoStream cs = new CryptoStream(decryptStream, decryptor, CryptoStreamMode.Write)) 
      { 
       cs.Write(buffer, 0, buffer.Length); 
      } 
      return decryptStream.ToArray(); 
     } catch(CryptographicException e){ 
      //... do something with it ... 
      return null; // I put the return null here as I got a syntax message saying 
         // not all code returns 
     } 
    } 

は、誰かが私が失敗した復号化メッセージを取得する方法を説明していただけますすべて私が最初にRowKeyを取得しようとするところまで を上にしてください。 内にu.RowKeyを入れなければならないのですか?

答えて

6

本当にに「do something」の部分が必要な場合を除き、メソッド内で例外をキャッチしないでください。例外をキャッチしないと、になるコードが見つかるまでスタックをバブルアップします。あなたがそのメソッド内で何かをする必要性を行うならば、そのようなログとして、あなたはそれ、これは

よりも優先されていることを

throw; 

注意を使用して、catchブロック内の例外と再スローをキャッチすることができます

throw e; 

後者はスタックトレースを書き換えます。この特定のケースではそれほど大きな違いはありませんが、意識する価値はあります。

私はあなたが今暗号化を無視して、良い記事やC#の例外処理に関する本を探しに行くことをお勧めします。 This MSDN pageはおそらく良い出発点です。すべてでそれをキャッチし、あなたの他の例外に高いそれがバブルをアップさせない単純かもしれません、しかし

catch (CrypotgraphicException e) 
{ 
    // Do something 
    throw; 
} 

:あなたが実際にこのレベルで何かをする必要があると仮定すると、

2

は、単に例外を再スローハンドラ。

2

例外をスタックに戻し続ける場合は、キャッチブロックからreturn nullを取り出してください。同じ例外で巻き戻しを続行するには、throw(例外参照なし)が必要です。

try 
{ 
    // Do stuff 
} 
catch(CryptographicException e) 
{ 
    // Do stuff to clean up 
    throw; 
} 

場合throw eあなたはそれがあまり便利になり、スタックトレースデータの一部を破壊する(既存の例外オブジェクトを持っています)。さらに情報を追加する場合は、新しい例外(InnerExceptionなど)に既存の例外をラップし、新しい例外オブジェクトをスローします。そうすれば完全な例外情報を保持できます。

try 
{ 
    // Do stuff 
} 
catch(CryptographicException e) 
{ 
    // Do stuff to clean up 
    Exception newEx = new Exception("Some further message", e); 
    throw newEx; 
} 

注:単にベースExceptionオブジェクトを作成しないでください、あなたは(適したExceptionクラスが利用できない場合)は、既存のベースから新しい例外クラスを派生し、派生バージョンを使用する必要があります。これは、あなたが必要とする正確なタイプをキャッチすることができ、広範な例外を投げているためにキャッチブロックが何をするかを把握する必要がないため、キャッチがずっと簡単になります。

1

の場合は、役に立つ可能性がある場合は例外をキャッチします。単にそれをあなたのDecryptメソッドで返すヌルを飲み込むだけでは役に立ちません。それはそれが有効処理できるポイントに到達するまで代わりに、アップ例外バブルを聞かせて...

は私も キャッチを試みる以内u.RowKeyを置く必要がありますか?

これは、例外をキャッチするために、より適切な場所でしょう...

関連する問題