无法跳出最终块
本文关键字: | 更新日期: 2023-09-27 18:35:21
我正在尝试从函数返回一个值。函数WcfProvider.MetalsPrices
可能会引发异常。我想避免它。
public IEnumerable<PriceOfMetal> GetPrice(int id, DateTime time)
{
bool condition = false;
DateTime timenew = time.AddDays(-1);
var allPrice = from c in db.PriceOfMetal
select c;
foreach (var i in allPrice)
{
if (i.Date.Date == timenew.Date && i.ListOfMetaL_Id==id)
{
condition = true;
}
}
try
{
if (condition == false)
{
var price = WcfProvider.MetalsPrices(id, time, time).Tables[0].AsEnumerable()
.Select(
a =>
new PriceOfMetal()
{
Date = a.Field<DateTime>("Date"),
ListOfMetaL_Id = a.Field<int>("MetalId"),
Value = a.Field<System.Double>("Price")
})
.ToList().Single();
db.PriceOfMetal.Add(price);
db.SaveChanges();
}
}
finally
{
var all = from c in db.PriceOfMetal select c;
return all;
}
我想最后返回块的值。可能吗?我收到一个错误。
您必须决定如果函数内部发生异常,函数是应该正常返回还是异常返回。
如果异常(您的呼叫者将看到异常):
try {
// do stuff
return answer;
}
finally {
// cleanup stuff
}
如果正常情况下,您需要处理异常:
try {
// do stuff
}
catch {
// recover stuff
}
// cleanup stuff
return answer;
您永远不能将 return
语句放在 finally
块中,因为finally
在存在未捕获的异常时运行,而当函数由于未捕获的异常而结束(异常)时,没有返回值。
您可能需要这样的模式
try
{
return here
}
catch(Exception ex)
{
// Catch any error
// re throw if you choose,
// or you can return if you choose
return here
}
finally
{
// allways do whats here
}
你可能想阅读这里的几个页面:try-catch-finally (C# 参考)
只是为了在此基础上再进一步构建,想象一下,如果我们可以在最终块内返回
你可能有一段像下面这样的讨厌的代码,这充其量是令人困惑
的try
{
return 10;
}
catch (Exception e)
{
return 20;
}
finally
{
return 30;
}
编译器会返回什么?
我很
抱歉这么说,但你的问题含糊不清,很难回答。您的代码看起来过于复杂。反正是放假时间。也许下面会帮助你。虽然不能保证。
public IEnumerable<PriceOfMetal> GetPrice(int id, DateTime time)
{
DateTime timenew = time.AddDays(-1);
var allPrice = from c in db.PriceOfMetal
select c;
where c.Date.Date == timenew.Date
and c.ListOfMetal_Id == id
if (!allPrice.Any())
{
try
{
var price = WcfProvider.MetalsPrices(id, time, time).Tables[0].AsEnumerable()
.Select(a =>new PriceOfMetal
{
Date = a.Field<DateTime>("Date"),
ListOfMetaL_Id = a.Field<int>("MetalId"),
Value = a.Field<System.Double>("Price")
})
.ToList().Single();
db.PriceOfMetal.Add(price);
db.SaveChanges();
}
catch
{
// Eating exceptions like this is really poor. You should improve the design.
}
}
return db.PriceOfMetal;
}