2011-06-30 29 views
2

我如何處理預期的異常?我怎麼能錯過異常

我有一些代碼在我的MVC控制器調用以下:

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

在我的其他SimplerAES類:

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

只是不要在你的方法中發現異常,除非你需要需要「做某事」部分。如果沒有捕獲該異常,它會冒泡堆棧,直到有代碼確實抓住它。

如果需要在該方法中做一些事情,比如日誌,你可以捕捉它使用

throw; 

注意,這是優於

您catch塊中的異常和 重新拋出
throw e; 

因爲後者將改寫堆棧跟蹤。在這個特殊情況下,這可能不會有太大的區別,但值得注意。

我建議你暫時忽略密碼,並去打獵在C#中的異常處理好文章或書籍。 This MSDN page可能是一個很好的起點。

2

假設你確實需要在這個層面做一些事情,只是重新拋出異常:

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

但是,它可能是簡單的不能趕上它在所有讓它泡了更高的其他異常處理程序。

2

如果您希望繼續爲異常展開堆棧,從catch塊不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類不可用),並使用派生版本。這使捕捉更容易,因爲你可以捕捉到你需要的確切類型,而不必讓你的catch塊知道你做了什麼,因爲你拋出了過於寬泛的例外。

1

只有有史以來如果有一些有用的東西你可以用它來捕獲一個異常。簡單地在Decrypt方法中將其返回爲null是沒有用的。相反,讓異常泡沫,直到它到達的地方可以被有效地處理了點..

我必須內把u.RowKey嘗試 抓呢?

這將是一個更合適的地方來捕獲異常...

相關問題