我可以在“Using”块中进行异常处理吗?

5
public virtual IQueryable<Hubs> getribbons(bool includeChildObjects)
        {
            using (var dbHelper = new DbHelper())
            {
                DbDataReaderExtended reader = null;
                try
                {
                    const string sqlQuery = "Select * From [ribbons]";
                    reader = dbHelper.ExecuteReader(sqlQuery, CommandType.Text, true);
                    IList<Hubs> models = new List<Hubs>();
                    while (reader.Read())
                    {
                        var model = GetHubDataFromReader(reader);
                        if (includeChildObjects)
                        {
                            model.Satellites = GetAllSatellites(true,model.HubID).ToList();
                        }
                        models.Add(model);
                    }
                    return models.AsQueryable();
                }
                finally
                {
                    if (reader != null) { reader.Close(); }
                }
            }
        }

这个函数在业务逻辑层。在catch块中需要处理异常并记录日志,然后将其扔到调用它的函数(Presentation Layer)中。最终需要关闭所有事项。
请告诉我如何处理错误。
我很新手C#,请给我一些解释,这对我非常有帮助。
提前感谢您。
3个回答

2

无论是否有异常抛出,finally块都将被调用。

使用using语句可以在Using块的范围退出时对任何非null对象调用IDisposable.Dispose()方法。


1
通过使用 finally 块,您可以清理在 try 块中分配的任何资源,并且即使在 try 块中发生异常,也可以运行代码。通常,当控制离开 try 语句时,finally 块的语句会执行。控制的转移可能是由于正常执行、执行 break、continue、goto 或 return 语句或将异常传播try 语句之外引起的。
通常情况下,如果未处理异常导致应用程序意外终止,finally 块是否运行并不重要。但是,如果 finally 块中包含必须在该情况下运行的语句,则一种解决方案是将 catch 块添加到 try-finally 语句中。或者,您可以在调用包含 try-finally 语句的方法的方法中更高层次的 try 块中捕获可能抛出的异常。也就是说,您可以在调用包含 try-finally 语句的方法的方法、调用该方法的方法或调用堆栈中的任何方法中捕获异常。如果未捕获异常,则 finally 块的执行取决于操作系统是否选择触发异常卸载操作。

这里的代码在数据访问层,我正在从表示层调用此方法。我需要做的是在数据访问层中捕获异常并将其抛出到表示层。 - user3008105
如何处理所有的异常?这是我的问题。 - user3008105

0

using语句仅为IDisposable对象提供类似的功能(清除资源)。

而在finally块的情况下,它将被执行,无论是否存在异常,只要调用堆栈中必须有catch块来捕获异常。开发人员可以使用finally块自行清除未使用IDispoable接口的资源。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接