1

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());
4

6 回答 6

2

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

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

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

现在编译器可以看到res在 try 块成功完成后总是会被赋值。

于 2011-10-02T07:47:01.877 回答
1

我理解您不愿意分配res给 null - 这感觉毫无意义,因此是错误的。但是,在这种情况下,当在分配对象的块之外需要一个对象时,这是一种常见的方法。假设您在 try/catch 块中分配变量是正确的(在许多情况下,这不是一种不常见的模式),我不会担心。

但是,如果分配失败会发生什么?第二个日志调用将尝试取消引用res,并抛出一个NullReferenceException. 这不好。

于 2011-10-02T07:47:09.667 回答
0

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

try
{
    res = ...
    _log.Debug(res.getString()); }
catch (Exception e)
{
    _log.Error("Cannot create demo account", e);
}
于 2011-10-02T07:46:51.193 回答
0

这是正确的方法。唯一的事情是,如果null是 的有效返回值,您可以在 .之后RegisterDemoAccount添加一个bool initialized = false您设置的值。 trueRegisterDemoAccount

于 2011-10-02T07:47:14.617 回答
0

就像你说的,如果你在 try/catch 之外需要它,将它分配给 null。这不是一种糟糕的编程方式。

于 2011-10-02T07:47:41.097 回答
0

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

为什么?如果您不初始化res然后RegisterDemoAccount(...)(或之前的另一个表达式)抛出然后res将不会在try语句中分配。

因此,执行可以到达未分配的最终语句(在catch块之后)res

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

于 2011-10-02T07:50:52.497 回答