在try-catch或finally块中放置return语句的位置

时间:2013-12-07 10:08:14

标签: c#

这是我的代码。任何人都可以告诉返回声明在哪里?我正在使用3层概念。

DataTable obj_dt = new DataTable();
public DataTable City_Name_get()
{            
    try
    {
        string store_pro = "sp_tb_city";
        obj_DB_Con.connection_db(store_pro, null);
        return obj_dt;
    }      
    catch (Exception ee)
    {
        MessageBox.Show(ee.Message, "Information", MessageBoxButtons.OK, MessageBoxIcon.Error);
    }
}

3 个答案:

答案 0 :(得分:1)

finally不允许您添加return声明。看看这个,看看why it is not legal to add control transfer statements in finally

你必须将它完全放在try/catch/finally之外,或者放在trycatch块中,否则编译器将不乐意编译。

public DataTable City_Name_get()
{
    try
    {
        string store_pro = "sp_tb_city";
        obj_DB_Con.connection_db(store_pro, null);
        return obj_dt;
    }      
    catch (Exception ee)
    {
        MessageBox.Show(ee.Message, "Information", MessageBoxButtons.OK, MessageBoxIcon.Error);
        return null;//Or whatever
    }
}

或者

public DataTable City_Name_get()
{
    try
    {
       //Do something
    }      
    catch (Exception ee)
    {
       //Do something more
    }
   finally
   {
      //Do something more
   }      
   return someDataTable;
}

答案 1 :(得分:1)

首先,您不应该在方法之外声明和初始化返回对象。我把它移到了下面的代码中。

至于返回,如果是异常,你可以返回null(因为你正在处理方法中的异常)。这样调用者就会知道存在错误。您应记录该方法的行为。

最后不是返回任何东西的地方。它是运行始终必须运行的代码,即使在异常的情况下,例如关闭非托管资源。

public DataTable City_Name_get()
{
    DataTable obj_dt = new DataTable();
    try
    {
        string store_pro = "sp_tb_city";
        obj_DB_Con.connection_db(store_pro, null);
        return obj_dt;
    }      
    catch (Exception ee)
    {
        MessageBox.Show(ee.Message, "Information", MessageBoxButtons.OK, MessageBoxIcon.Error);
        return null;
    }
}

答案 2 :(得分:1)

这是个人品味的问题。 catch块将在执行后从方法返回,并且finally块将在return语句之前执行,无论其位置如何。 你可能会坚持使用一种风格,但它应该是一致的(当团队范围的风格指南到位时,这就是定义它的地方)。

(就我个人而言,我总是在方法的最后写return。对我来说,这会使你的可读性更好一些。)

HTH Thomas