为什么我不能从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)
{
}
}
任何帮助都会受到赞赏,因为我现在被困住了:(。
答案 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
区块必须有return
或throw
语句
答案 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)
在您的情况下,您无法保证将返回图像。这就是为什么你需要返回一些东西或者抛出异常。