C# 是否尝试/catch Image.FromStream(),但不捕获using语句的其余部分?
C# 是否尝试/catch Image.FromStream(),但不捕获using语句的其余部分?,c#,try-catch,using,using-statement,C#,Try Catch,Using,Using Statement,Image.FromStream在上载非图像的内容时抛出一个InvalidArgumentException 因此,我有类似的代码: public void ActionMethod() { try { using ( var image = Image.FromStream(httpPostedFileBase.InputStream) ) { MoreStuffToDo(image); } }
Image.FromStream
在上载非图像的内容时抛出一个InvalidArgumentException
因此,我有类似的代码:
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()中
我能想到的唯一解决方案是删除using语句。但这听起来也是一个糟糕的决定
正确的方法是什么?因此,我们对Image.FromStream()
方法都有一个try/catch,并且确保在所有情况下都正确地处理了该图像?这并不重要。。。这是对IDisposable的调用。
<代码>使用在幕后为您发出该调用,允许您简单地编写以下内容:
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();
}
}
需要注意的是,即使您的代码引发了异常,您的映像仍然被正确地处理。这就是“使用”的工作原理。只要代码(现在不管如何)离开using部分,对象就被释放。