3

我为什么不能从 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)
        {

        }
    }

任何帮助将不胜感激,因为我现在被困住了:(。

4

9 回答 9

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

于 2012-05-09T17:29:00.900 回答
2

如果在图像加载失败时接受返回 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;
        }
    }

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

于 2012-05-09T17:30:28.190 回答
2

您可以从 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;
}
于 2012-05-09T17:48:43.330 回答
1

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

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

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

于 2012-05-09T17:28:51.880 回答
0

因为如果出现异常,则不会返回任何内容。要么你 catch 返回 null,要么完整的方法应该返回 null。

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

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;
    }
于 2012-05-09T17:28:54.057 回答
0

您的“catch”块中没有返回语句。

如果img.Save抛出异常,您将输入catch,然后离开catch并且永远不会碰到return。例如:

public static Image GetExternalImg(string name, string size)
{
    try
    {
        // Code here
        return img;
    }
    catch (Exception)
    {
        return null;
    }
}
于 2012-05-09T17:29:29.967 回答
0

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

catch块中必须有一个return或一个throw语句

于 2012-05-09T17:30:15.543 回答
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;

        }
于 2012-05-09T17:30:49.157 回答
0

在您的情况下,您不能保证会返回图像。这就是为什么你需要返回一些东西或重新抛出异常。

于 2012-05-09T17:30:59.190 回答