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());
在捕获未知异常后不应该尝试继续您的方法。任何事情都有可能出错,假设继续下去是安全的是没有意义的。如果你去尝试,只会发生不好的事情。
返回一个错误结果,或者更好,只是重新抛出原始异常:
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);
}
这是正确的方法。只有一点,如果null
是RegisterDemoAccount
的有效返回值,您可以在RegisterDemoAccount
之后添加一个bool initialized = false
,并将其设置为true
。
如果您需要在try/catch之外将其赋值为null,就像您说的那样。这是一种不错的编程方式。
但是我不认为这是一个好的编程方法。
为什么?如果你没有初始化res
,然后RegisterDemoAccount(...)
(或在它之前的另一个表达式)抛出,那么res
将不会在try
语句中被赋值。
因此,在res
未赋值的情况下,执行可以到达最后一条语句(在catch
块之后)。
问题是在最后一条语句中使用了res
——编译器可以看到它可以在没有初始化的情况下到达这一点。