2015-12-21 36 views
2

Image.FromStream當您上傳不是圖片的東西時會拋出InvalidArgumentExceptionTry/catch Image.FromStream()沒有捕獲using語句的其餘部分?

所以我有類似下面的代碼:

public void ActionMethod() 
{ 
    try 
    { 
     using (var image = Image.FromStream(httpPostedFileBase.InputStream)) 
     { 
      MoreStuffToDo(image); 
     } 
    } 
    catch (InvalidArgumentException e) 
    { 
     ModelState.AddModelError("", "File is not a valid image"); 
    } 
} 

問題是,InvalidArgumentException也捕捉具有無關Image.FromStream,即MoreStuffToDo()

我能想到的唯一解決方案是東西刪除使用語句。但這聽起來像是一個不好的決定。

這樣做的正確方法是什麼?所以我們在Image.FromStream()方法中都有一個try/catch,並且確保圖像在所有情況下都能正確處理?

+0

一些需要注意的是,即使當異常與你的代碼拋出,你的形象仍然是妥善處置。這就是「使用」的工作方式。一旦代碼,現在問題如何,離開使用部分,對象配置。 – Russ

回答

4

這不是using這很重要......這是對IDisposable. Dispose()的呼叫。 using,使該呼叫你,在幕後,讓你簡單地寫:

using(var x = new X()) 
{ 
    // do stuff with x 
} 

...而不是這樣的:

X x = null; 
try 
{ 
    x = new X(); 
    // do stuff with x 
} 
finally 
{ 
    if(x != null) 
    { 
     x.Dispose(); // clean up resources 
    } 
} 

這是跳過一堆鍋爐 - 一個很好的方式板碼,但你決不會被迫使用它。您可以顯式調用IDisposable.Dispose()和更多的控制自己留下了,會發生什麼,其中:

public void ActionMethod() 
{ 
    // declare image... 
    Image image = null; 

    try 
    { 
     // attempt to load image from stream... 
     image = Image.FromStream(httpPostedFileBase.InputStream) 
    } 
    catch 
    { 
     // failed to load image from stream... 
     ModelState.AddModelError("", "File is not a valid image"); 
     // exit 
     return; 
    } 

    try 
    { 
     // perform additional processing... 
     MoreStuffToDo(image); 
    } 
    catch 
    { 
     // handle errors from MoreStuffToDo() 
    } 
    finally 
    { 
     // clean up image... 
     image.Dispose(); 
    } 
}