C#从try-catch块返回

时间:2012-05-09 17:27:34

标签: c# return try-catch

为什么我不能从try块中返回我从url获取的图像? 抱歉英语不好:(。

这是我得到的错误:

  

缺少退货声明

    public static Image GetExternalImg(string name, string size)
    {
        try
        {
            // Get the image from the web.
            WebRequest req = WebRequest.Create(String.Format("http://www.picturesite.com/picture.png", name, size));
            // Read the image that we get in a stream.
            Stream stream = req.GetResponse().GetResponseStream();
            // Save the image from the stream that we are rreading.
            Image img = Image.FromStream(stream);
            // Save the image to local storage.
            img.Save(Environment.CurrentDirectory + "\\images\\" + name + ".png");
            return img;
        }
        catch (Exception)
        {

        }
    }

任何帮助都会受到赞赏,因为我现在被困住了:(。

9 个答案:

答案 0 :(得分:7)

您需要从所有可能的执行路径返回。

因此,如果您的try失败,则需要从catch或函数末尾返回一些内容。

注意:

你真的不应该有空catch块 - 吞咽异常是一个非常糟糕的习惯,它可以调试并找到异常来自真正困难的地方。

我会将函数编写为:

public static Image GetExternalImg(string name, string size)
{
    // Get the image from the web.
    WebRequest req = WebRequest.Create(String.Format("http://www.picturesite.com/picture.png", name, size));
    // Read the image that we get in a stream.
    Stream stream = req.GetResponse().GetResponseStream();
    // Save the image from the stream that we are rreading.
    Image img = Image.FromStream(stream);
    // Save the image to local storage.
    img.Save(Environment.CurrentDirectory + "\\images\\" + name + ".png");
    return img;
}

如果你catch块中有某些内容,请在记录之后抛出异常(throw;),或者返回null

答案 1 :(得分:1)

退出try时需要一个return语句来处理这种情况,因为抛出了异常。

所有代码路径都必须有一个返回,而你有一个不返回。即,输入try块,抛出异常,然后在catch中吞下它。离开渔获后,你没有回报。

顺便说一句,吞下顶级Exception类型是邪恶的。不要这样做。

答案 2 :(得分:1)

您可以从try块返回一个对象。您必须确保所有执行路径都返回该对象。

如果我们在try块中获取图像:

public Image GetPicture()
{
    try
    {
       Image image = GetImageFromDb();
       return image;
    }
    catch(Exception ex)
    {

    }
}

如果在调用GetImageFromDb()期间抛出异常,则控件将传递给catch块。这意味着我们跳过return语句。当控制权传递给调用者时,调用者期望返回值。

var callerVariable = GetPicture();

现在我们需要从catch传回一个值才能执行赋值。因为我们正在处理引用类型,所以我们可以返回null(假设null是一个有效的执行状态)。将捕获更新为

catch(Exception ex)
{
  return null;
}

答案 3 :(得分:0)

因为如果您有例外,则不会返回任何内容。要么捕获返回null,要么complete方法应该返回null。

您可以使用以下两个返回语句之一。

public static Image GetExternalImg(string name, string size)
    {
        try
        {
            // Get the image from the web.
            WebRequest req = WebRequest.Create(String.Format("http://www.picturesite.com/picture.png", name, size));
            // Read the image that we get in a stream.
            Stream stream = req.GetResponse().GetResponseStream();
            // Save the image from the stream that we are rreading.
            Image img = Image.FromStream(stream);
            // Save the image to local storage.
            img.Save(Environment.CurrentDirectory + "\\images\\" + name + ".png");
            return img;
        }
        catch (Exception)
        {
            //return null;
        }

        //return null;
    }

答案 4 :(得分:0)

你的'catch'区块中没有return语句。

如果img.Save引发异常,您将输入catch,然后退出catch,永远不会点击return。例如:

public static Image GetExternalImg(string name, string size)
{
    try
    {
        // Code here
        return img;
    }
    catch (Exception)
    {
        return null;
    }
}

答案 5 :(得分:0)

该函数必须在所有可能的代码路径上都有return。这里一个可能的代码路径是try块的主体抛出一个异常,该异常在catch块中处理。包含catch块的代码路径没有return语句,因此是非法的。

catch区块必须有returnthrow语句

答案 6 :(得分:0)

如果在图像加载失败时接受返回null,则可以:

public static Image GetExternalImg(string name, string size)
    {
        try
        {
            // Get the image from the web.
            WebRequest req = WebRequest.Create(String.Format("http://www.picturesite.com/picture.png", name, size));
            // Read the image that we get in a stream.
            Stream stream = req.GetResponse().GetResponseStream();
            // Save the image from the stream that we are rreading.
            Image img = Image.FromStream(stream);
            // Save the image to local storage.
            img.Save(Environment.CurrentDirectory + "\\images\\" + name + ".png");
            return img;
        }
        catch (Exception)
        {
              //grab an image from resource
              return theDefaultImage;
        }
    }

否则,捕获异常时该方法应该返回什么? 另外,你不应该像上面那样隐藏异常,这是一种非常糟糕的做法。

答案 7 :(得分:0)

这里你去:

  public static Image GetExternalImg(string name, string size)
        {
            try
            {
                // Get the image from the web.
                WebRequest req = WebRequest.Create(String.Format("http://www.picturesite.com/picture.png", name, size));
                // Read the image that we get in a stream.
                Stream stream = req.GetResponse().GetResponseStream();
                // Save the image from the stream that we are rreading.
                Image img = Image.FromStream(stream);
                // Save the image to local storage.
                img.Save(Environment.CurrentDirectory + "\\images\\" + name + ".png");
                return img;
            }
            catch (Exception)
            {

            }
        return null;

        }

答案 8 :(得分:0)

在您的情况下,您无法保证将返回图像。这就是为什么你需要返回一些东西或者抛出异常。