W1035:関数「Take」の戻り値が未定義の可能性があります

stanleyxu2005

辞書から要素をポップする関数があります。何か問題が発生した場合は、例外をスローする必要があります。コードはかなり大丈夫に見えます。

type 
  ENoSuchElementException = class(Exception);
var
  FResults: TDictionary<Cardinal, TObject> = TDictionary<Cardinal, TObject>.Create;
  FLock: TCriticalSection = TCriticalSection.Create;

/// <exceptions cref="ENoSuchElementException">Element does not exist</exceptions>
function Take(Id: Cardinal): TObject;
begin    
  FLock.Acquire;
  try
    try
      Result := FResults[Id]; // here may throw exception
      FResults.Remove(Id);
    except
      on E: Exception do
      begin
        raise ENoSuchElementException.Create(E.ToString);
      end;
    end;
  finally
    FLock.Release;
  end;
end;

しかし、DelphiXE4コンパイラはについて文句を言いW1035: Return value of function 'Take' might be undefinedます。

私は突然とても混乱しています。例外がスローされた場合でも、コードが戻り値を期待しているのはなぜですか?それtry...finallyは例外を食べるという意味ですか?誰かが私のコードの問題を指摘できますか?

解決済み: Davidが述べたように、try...exceptは外側に移動する必要があります。ありがとう!

デビッド・ヘファーナン

これは、32ビットコンパイラによって報告された誤検知のようです。64ビットコンパイラは、コードの警告を報告しません。そして、64ビットコンパイラは正しいです。おそらく、32ビットコンパイラは、例外をキャッチしていることを認識し、その後常に別の例外を発生させることを検出しません。

32ビットコンパイラの誤診を回避する1つの方法は、try / exceptを最も外側のブロックにすることです。次のSSCCEを検討してください。

{$APPTYPE CONSOLE}

uses
  SysUtils;

procedure Foo;
begin
end;

function Take1(const Id: Integer): Integer;
begin
  try
    try
      Foo;
      Result := 42;
    except
      on E:Exception do
      begin
        raise Exception.Create(E.ToString);
      end;
    end;
  finally
  end;
end;

function Take2(const Id: Integer): Integer;
begin
  try
    try
      Foo;
      Result := 42;
    finally
    end;
  except
    on E:Exception do
    begin
      raise Exception.Create(E.ToString);
    end;
  end;
end;

begin
end.

コンパイラの出力は次のとおりです。

[dcc32警告] W1035関数「Take1」の戻り値が未定義の可能性があります

だから、Take1あなたのコードの私の簡略化されたバージョンです。32ビットコンパイラはそのことを警告します。そして、Take2の順序入れ替えexceptなどをfinallyそして、コンパイラは警告しません。

おそらく、この回避策はあなたのためのものではありませんが、あなたはこの性質の何かを考え出す必要があります。

肝心なのは、分析が正しく、コンパイラが間違っているということです。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

Javascript関数が未定義であり、まだ呼び出し可能である可能性はありますか?

分類Dev

関数がExceptionをスローする場合、関数の戻り値の型はExceptionになる可能性があります

分類Dev

文字列値 ''のTypescriptでオブジェクトが '未定義'である可能性があります

分類Dev

配列を破棄すると、型から未定義の値が削除される可能性があります

分類Dev

未定義を返す可能性のある関数の戻りを破壊する

分類Dev

未定義を返す可能性のある関数の戻りを破壊する

分類Dev

警告の回避:「count」の操作が未定義である可能性があります[-Wsequence-point]

分類Dev

SQL構文にエラーがあります。-および未定義の変数エラー-接続されている可能性があります

分類Dev

BobJenkinsHash関数の結果が負になる可能性はありますか?

分類Dev

if文でもオブジェクトが未定義の可能性があります

分類Dev

このmemcpyは未定義の動作を引き起こす可能性がありますか?

分類Dev

AS_IFおよびAC_MSG_ERROR:エラー:未定義のマクロの可能性があります

分類Dev

エラー:新しい型は戻り値の型で定義されていない可能性があります

分類Dev

For-Inループの結果が未定義またはnullになる可能性はありますか?

分類Dev

未定義のインデックス0php laravel(重複している可能性があります)

分類Dev

制御が非void関数の終わりに達する可能性があります[-Werror、-Wreturn-type]

分類Dev

char 5:エラー:制御が非void関数の終わりに達する可能性があります

分類Dev

iOS「コントロールが非void関数の終わりに達する可能性があります」

分類Dev

制御が非void関数Xcodec ++の終わりに達する可能性があります

分類Dev

警告:制御が非void関数の終わりに達する可能性があります[-Wreturn-type]

分類Dev

警告:制御が非void関数の終わりに達する可能性があります[-Wreturn-type]}

分類Dev

制御が非void関数の終わりに達する可能性がありますERROR

分類Dev

制御が非void関数の終わりに達する可能性があります。周波数

分類Dev

警告「<変数>の操作が定義されていない可能性があります」

分類Dev

その関数の結果を定義する方法は、typescriptで定義されていない可能性があります

分類Dev

未定義の変数はどのようにして型エラーをスローする可能性がありますか?

分類Dev

未定義の動作により、例外をスローしないように定義された関数で例外が発生する可能性がありますか?

分類Dev

TypeScript(err:2532):null /未定義のチェックにもかかわらず、オブジェクトが未定義である可能性があります

分類Dev

JSは2D配列の値を変更していますが、別の関数が干渉している可能性がありますか?

Related 関連記事

  1. 1

    Javascript関数が未定義であり、まだ呼び出し可能である可能性はありますか?

  2. 2

    関数がExceptionをスローする場合、関数の戻り値の型はExceptionになる可能性があります

  3. 3

    文字列値 ''のTypescriptでオブジェクトが '未定義'である可能性があります

  4. 4

    配列を破棄すると、型から未定義の値が削除される可能性があります

  5. 5

    未定義を返す可能性のある関数の戻りを破壊する

  6. 6

    未定義を返す可能性のある関数の戻りを破壊する

  7. 7

    警告の回避:「count」の操作が未定義である可能性があります[-Wsequence-point]

  8. 8

    SQL構文にエラーがあります。-および未定義の変数エラー-接続されている可能性があります

  9. 9

    BobJenkinsHash関数の結果が負になる可能性はありますか?

  10. 10

    if文でもオブジェクトが未定義の可能性があります

  11. 11

    このmemcpyは未定義の動作を引き起こす可能性がありますか?

  12. 12

    AS_IFおよびAC_MSG_ERROR:エラー:未定義のマクロの可能性があります

  13. 13

    エラー:新しい型は戻り値の型で定義されていない可能性があります

  14. 14

    For-Inループの結果が未定義またはnullになる可能性はありますか?

  15. 15

    未定義のインデックス0php laravel(重複している可能性があります)

  16. 16

    制御が非void関数の終わりに達する可能性があります[-Werror、-Wreturn-type]

  17. 17

    char 5:エラー:制御が非void関数の終わりに達する可能性があります

  18. 18

    iOS「コントロールが非void関数の終わりに達する可能性があります」

  19. 19

    制御が非void関数Xcodec ++の終わりに達する可能性があります

  20. 20

    警告:制御が非void関数の終わりに達する可能性があります[-Wreturn-type]

  21. 21

    警告:制御が非void関数の終わりに達する可能性があります[-Wreturn-type]}

  22. 22

    制御が非void関数の終わりに達する可能性がありますERROR

  23. 23

    制御が非void関数の終わりに達する可能性があります。周波数

  24. 24

    警告「<変数>の操作が定義されていない可能性があります」

  25. 25

    その関数の結果を定義する方法は、typescriptで定義されていない可能性があります

  26. 26

    未定義の変数はどのようにして型エラーをスローする可能性がありますか?

  27. 27

    未定義の動作により、例外をスローしないように定義された関数で例外が発生する可能性がありますか?

  28. 28

    TypeScript(err:2532):null /未定義のチェックにもかかわらず、オブジェクトが未定義である可能性があります

  29. 29

    JSは2D配列の値を変更していますが、別の関数が干渉している可能性がありますか?

ホットタグ

アーカイブ