无法跳出最终块

本文关键字: | 更新日期: 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;
}  
相关文章:
  • 没有找到相关文章