1

crmFactory.RegisterDemoAccount投げExceptionます。変数を使用するには、変数resを初期化する必要があります。

は初期化できないため、割り当てられていない変数の使用に関するコンパイル エラーを発生させずAccountRegistrationResponseに宣言するにはどうすればよいですか? resnull に割り当てることはできますが、これは良いプログラミング アプローチではないと思います。

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

nullに代入resすることに消極的であることは理解しています。それは無意味で、間違っていると感じます。ただし、オブジェクトが割り当てられているブロックの外側でオブジェクトが必要な場合、このような状況では一般的なアプローチです。あなたが変数を try/catch ブロックに代入する際に正しいことをしていると仮定すると (多くの場合、これは珍しいパターンではありません)、私はそれについて心配する必要はありません。

しかし、割り当てが失敗した場合はどうなりますか? 2 番目のロギング呼び出しは、 を逆参照しようとしresNullReferenceException. それは良いことではありません。

于 2011-10-02T07:47:09.667 に答える
0

コンパイラresが初期化されたことを認識できるように、ログ行を try/catch 内に配置する必要があります。

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た a を追加できます。 bool initialized = falsetrueRegisterDemoAccount

于 2011-10-02T07:47:14.617 に答える
0

あなたが言ったように、try/catchの外で必要な場合はnullに割り当ててください。それはプログラミングの悪い方法ではありません。

于 2011-10-02T07:47:41.097 に答える
0

しかし、これは良いプログラミング手法ではないと思います。

なんで?初期化せずresRegisterDemoAccount(...)(またはその前に別の式を) スローすると、ステートメントresで代入されません。try

したがって、実行は割り当てられていないcatch状態で (ブロックの後) 最後のステートメントに到達する可能性があります。res

問題は、resその最後のステートメントでの使用です。コンパイラーは、初期化なしでこの時点に到達できることを確認できます。

于 2011-10-02T07:50:52.497 に答える