c# -如何在try catch块中使用未赋值变量

本文关键字:变量 赋值 catch try | 更新日期: 2023-09-27 18:10:25

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

c# -如何在try catch块中使用未赋值变量

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

返回一个错误结果,或者更好,只是重新抛出原始异常:

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

现在编译器可以看到,res总是在try块成功完成后被分配。

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

但是,如果赋值失败会发生什么?第二个日志调用将尝试解引用res,并抛出NullReferenceException

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

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

这是正确的方法。只有一点,如果nullRegisterDemoAccount的有效返回值,您可以在RegisterDemoAccount之后添加一个bool initialized = false,并将其设置为true

如果您需要在try/catch之外将其赋值为null,就像您说的那样。这是一种不错的编程方式。

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

为什么?如果你没有初始化res,然后RegisterDemoAccount(...)(或在它之前的另一个表达式)抛出,那么res将不会在try语句中被赋值。

因此,在res未赋值的情况下,执行可以到达最后一条语句(在catch块之后)。

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