【问题标题】:what is the best way to initialize object with try, catch block without using block in c#什么是使用try初始化对象的最佳方法,catch块而不使用c#
【发布时间】:2014-09-25 10:45:29
【问题描述】:

我有一种方法,我想初始化一个类的对象(例如获取部门列表)并在 try/catch 块中使用相同的对象(例如返回该部门列表),然后想将其设置为 null。

  1. 一种方式

    public List<Departments> GetAllDepartments()
    {
        List<Departments> listDepartments = null;
        try
        {
            listDepartments = IDepartment.GetAllDepartments();
    
            return listDepartments;
        }
        catch (System.Exception ex)
        {
            throw ex;
        }
        finally
        {
            listDepartments = null;
        }
    }
    
  2. 另一种方式

    public List<Departments> GetAllDepartments()
    {
        try
        {
            List<Departments> listDepartments = IDepartment.GetAllDepartments();
    
            return listDepartments;
        }
        catch (System.Exception ex)
        {
            throw ex;
        }
    }
    

哪个最好?如果有任何其他方式,请告诉我。我和我的办公室同事讨论过这个问题,有人告诉我,在一种方法中,我强制编译器初始化对象(这里是 listDepartment),首先设置为 null,然后强制使用数据库对象进行编译。

注意:我无法使用 IDisposable。

很抱歉,我无法在第一次运行时非常清楚地提出问题。这只是部门的一个例子,实际上我的方法中还有许多其他过滤器和其他对象。我主要关心的是,当第一行捕获时,编译器将如何工作,例如 ' List listx = null; ' 和 listx = new xClass();或 listx = [数据库调用]。正如我的办公室同事告诉我的,这是编译器的额外开销。我想在这里清除我的这个疑问。


请忘记上面的问题

我在这里重新定义我的问题。

问题: 我和我的一位办公室同事就初始化对象并在使用后将其设置为 null 进行了辩论。

我建议他使用以下方法来释放该对象:

public string something()
{
    Department objDepartment = null;

    try
    {
        objDepartment = new Department();
    }
    catch
    .
    .
    .
    finally
    {
       objDepartment = null;
    }
}

我的办公室同事告诉我,首先在这里我强制 .net 编译器使用 null 初始化 objDepartment,然后在 try 块内我再次强制 .net 编译器使用实际实例初始化 objDepartment。所以根据他的说法,代码应该是:

public string something()
{

    try
    {
        Department objDepartment = new Department();
    }
    catch
    .
    .
    .
}

所以我的问题是:一旦使用了对象,我如何释放它,因为 objDepartment 在 finally 块中不可用,因为它的范围现在仅在 try 块内。如果有任何其他初始化方式,请使用它并最终释放它。

另一个条件是,我不能使用 IDisposable。

感谢所有参与并给出答案的人。还有一次,我期待您的积极参与。

【问题讨论】:

  • 为什么捕获异常只是为了重新抛出它们?这样你会丢失堆栈跟踪。
  • 你为什么要创建listDepartments而不是简单的return IDepartment.GetAllDepartments();
  • 为什么要在方法结束时将局部变量设置为 null?你期望它实现什么?为什么你的方法体不只是return IDepartment.GetAllDepartments();
  • @DenielKelley 谢谢,但如果你提供一些代码示例,那么它真的很有帮助。
  • 如果您需要重新抛出异常,请仅使用 throw,这样可以保留堆栈跟踪。

标签: c# try-catch


【解决方案1】:
public List<Departments> GetAllDepartments()
{
    return IDepartment.GetAllDepartments();
}

这是您问题中唯一有用的代码。在退出之前将本地(又名方法变量)设置为null 没有任何意义或好处;这没有目的,不代表“收藏”或任何类似的东西 - 所以finally 没有任何意义。 catch 块同样没用,除非您的明确意图是破坏您自己的堆栈跟踪。

如果您需要在返回之前对对象执行额外的代码:

public List<Departments> GetAllDepartments()
{
    var departments = IDepartment.GetAllDepartments();
    // TODO: do stuff with "departments" here
    return departments;
}

【讨论】:

    【解决方案2】:

    由于您没有执行任何自定义异常,因此 try 和 catch 在这种情况下没有任何意义。因此,您可以使用如下代码。

    public List<Departments> GetAllDepartments()
    {
    
            return IDepartment.GetAllDepartments();
     }
    

    【讨论】:

      【解决方案3】:

      您可以使用下面的代码。它会避免多个返回语句。

       public List<Departments> GetAllDepartments()
          {
              List<Departments> listDepartments = null;
              try
              {
                  listDepartments = IDepartment.GetAllDepartments();       
              }
              catch (System.Exception ex)
              {
                 //Handle your exception
              }
              return listDepartments; 
          }
      

      【讨论】:

      • 我不确定这如何解决问题
      • 它没有。典型的“让我们发布一些东西并希望”答案。
      【解决方案4】:
       public List<Departments> GetAllDepartments()
              {
                  try
                  {
                      return IDepartment.GetAllDepartments();
      
      
                  }
                  catch (System.Exception ex)
                  {
                    //  throw ex;  dont throw the same caugted exception
                  }
              }
      

      【讨论】:

      • 它不仅会吞下异常,而且只捕获 System.Exception 通常是一种非常糟糕的做法。
      • @MarcGravell “在 try/catch 块中使用相同的内容”来自问题
      • @BinsonEldhose 对吞下异常一无所知;
      • 所有,我在这个问题上关注的是,如何优化对象的初始化并返回。 catch 块中的注释部分是一个建议。我认为抛出相同的异常是个坏主意。与其抛出不如修改或记录等。
      猜你喜欢
      • 1970-01-01
      • 2012-01-28
      • 1970-01-01
      • 1970-01-01
      • 2020-03-09
      • 1970-01-01
      • 1970-01-01
      • 2010-09-17
      • 1970-01-01
      相关资源
      最近更新 更多