Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 是否尝试/catch Image.FromStream(),但不捕获using语句的其余部分?_C#_Try Catch_Using_Using Statement - Fatal编程技术网

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部分,对象就被释放。