2011-10-11 43 views
1

我已經查看了與此問題相關的其他問題,但我沒有看到可幫助我的答案(或者更多地瞭解我的觀點)。Try - Catch Block的未處理異常

此代碼:

public static Bitmap GetLibraryObjectImage(Guid guid) { 
      try { 
       string tempPath = GetLibraryObjectImagePath(guid); 
       if (tempPath != string.Empty) { 
        var bytes = File.ReadAllBytes(tempPath); 
        var ms = new MemoryStream(bytes); 
        return (Bitmap)Image.FromStream(ms); 
       } 
      } 
      catch { 
       return (Bitmap)Image.FromFile(Application.StartupPath + @"\na.bmp"); 
      } 

      return (Bitmap)Image.FromFile(Application.StartupPath + @"\na.bmp"); 
     } 

旨在應對該圖像文件找不到,或以其他方式無效的任何情況。我沒有確定任何具體的異常類型,希望它能捕捉到任何東西。

爲我的用戶之一扔這個異常:

無效參數。
在System.Drawing.Image.FromStream(流 流,布爾useEmbeddedColorManagement,布爾validateImageData) 在System.Drawing.Image.FromStream(流流)
在ScruffyDuck.AirportDesignEditor.Helpers.U.GetLibraryObjectImage(GUID GUID )

我在處理圖像的try-catch塊的其他情況下看過這個。我認爲上面的try-catch會得到一切,包括非託管異常,但也許我錯了。

我不知道引起異常的情況,但我真的不希望我的應用程序崩潰,即使我正在嘗試管理這些問題也會燒燬。它被我的全局異常處理程序捕獲,但當然有點晚了。

任何洞察避免這種

+2

如何某些你這個用戶真的使用該版本的代碼* *?我會很驚訝地發現這種情況。 –

+1

喬恩這是一個很好的觀點。我們最近發佈了一些小的更新。看他正在使用的版本我認爲我正在尋找正確的代碼。不過,我現在要回到存儲庫檢查 – ScruffyDuck

+3

這就是爲什麼,如果軟件是內部的,我更喜歡爲甚至發佈配置生成PDB;它會給你線路號碼,如果它們不匹配最新的信號源,則表示一個過時的軟件版本。 – KeithS

回答

1

正如在評論中提到@KeithS非常感謝,該堆棧跟蹤顯示,該異常源自Image.FromStream方法。您是否已驗證導致該調用的所有代碼是否正確返回了預期的數據?文件路徑必須存在(或者File.ReadAllBytes會引發異常),並且MemoryStream構造函數正在返回一個有效的流(或者它將引發異常),但有可能內存流中的數據實際上不是圖像?

另外,您也可以嘗試使用File.OpenRead方法。這將返回FileStream,因此您可以直接將其傳遞給Image.FromStream方法。這看起來類似於下面的代碼。 (我改變了它的一些使用using聲明,只有一個返回語句。)

public static Bitmap GetLibraryObjectImage(Guid guid) 
{ 
    Bitmap bitmap = null; 

    try 
    { 
     string tempPath = GetLibraryObjectImagePath(guid); 
     if (!String.IsNullOrEmpty(tempPath) 
     { 
     using (var stream = File.OpenRead(tempPath)) 
     { 
      bitmap = (Bitmap)Image.FromStream(stream); 
     } 
     } 
    } 
    catch 
    { 
     bitmap = (Bitmap)Image.FromFile(Application.StartupPath + @"\na.bmp"); 
    } 

    if (bitmap == null) 
    { 
     bitmap = (Bitmap)Image.FromFile(Application.StartupPath + @"\na.bmp"); 
    } 

    return bitmap; 
}