C# - 如何在try catch块中使用未分配的变量

时间:2011-10-02 07:43:34

标签: c# unassigned-variable

crmFactory.RegisterDemoAccount抛出Exception。为了使用变量res,我需要初始化它。

由于AccountRegistrationResponse无法初始化,如何在不获取有关使用未分配变量的编译错误的情况下声明res? 我可以将它指定为null,但我认为这不是一个好的编程方法。

AccountRegistrationResponse res /*=null*/; 
 try
 {
  res = crmFactory.RegisterDemoAccount(CrmConfigRepository.CrmOwnerUserId
                                   , CrmConfigRepository.CrmOrganizationName
                                   , CrmConfigRepository.CrmBusinessUnitName
                                   , demo.getData());
 }
 catch (Exception e)
 {
      _log.Error("Cannot create demo account", e);
 }
 _log.Debug(res.getString());

6 个答案:

答案 0 :(得分:2)

在捕获未知异常后,您不应该尝试继续使用您的方法。任何事情都可能出错,假设继续下去是没有意义的。如果你尝试,只会发生坏事。

要么返回错误结果,要么更好,只需重新抛出原始异常:

 catch (Exception e)
 {
      _log.Error("Cannot create demo account", e);
      throw;
 }

现在,编译器可以看到在try块成功完成后将始终分配res

答案 1 :(得分:1)

我理解你不愿意将res指定为null - 这感觉毫无意义,因此也是错误的。然而,在这样的情况下,当在分配它的块之外需要一个对象时,这是一种常见的方法。假设你在try / catch块中分配你的变量做了正确的事情(在许多情况下它并不是一个不常见的模式),我不会担心它。

然而,如果作业失败会发生什么?第二次日志记录调用将尝试取消引用res,并抛出NullReferenceException。那不好。

答案 2 :(得分:0)

您需要将日志记录行放在try / catch中,以便编译器知道res已初始化。

try
{
    res = ...
    _log.Debug(res.getString()); }
catch (Exception e)
{
    _log.Error("Cannot create demo account", e);
}

答案 3 :(得分:0)

这是正确的方法。唯一的问题是,如果null的有效返回值为RegisterDemoAccount,则可以在bool initialized = false之后添加true RegisterDemoAccount

答案 4 :(得分:0)

如果你在try / catch之外需要它,就像你说的那样将它分配给null。编程方式并不错。

答案 5 :(得分:0)

  

但我不认为这是一种很好的编程方法。

为什么呢?如果您未初始化res然后RegisterDemoAccount(...)(或其前的其他表达式)抛出,则res语句中将不会分配try

因此执行可以在catch未分配的情况下到达最终声明(res块之后)。

问题是在最后一个语句中使用res - 编译器可以看到它可以在没有初始化的情况下达到这一点。