2

Delphi での例外処理に関する 2 つの非常に基本的な質問です。

1) いつTry?私の推測では、Try周りに句は必要ありません

  • 割り当て、条件、ループなどの単純なコード
  • VCL コンポーネントへのアクセス

しかし、私はする必要がありますTry

  • データベース アクセス
  • 例外が発生するかどうかわからないため、サードパーティのコンポーネント
  • ヘルプ システムが表示するものはすべて、例外を発生させる可能性があります

何か見逃しましたか?

2) 試して... 最後に、または試して... を除いて... または両方? @RRUZが私の質問の1つにいくつかのコードで 答えるまで、私は何年もの間、これはどちらか/または選択であると考えていました

 try
    CoInitialize(nil);
    try
      SetStaticIpAddress('Network card name','192.168.1.1','255.255.255.0');
    finally
      CoUninitialize;
    end;
 except
    on E:EOleException do
        Writeln(Format('EOleException %s %x', [E.Message,E.ErrorCode]));
    on E:Exception do
        Writeln(E.Classname, ':', E.Message);
 end;

CoInitialize(nil);質問: それ以外は、からまたはからの例外をキャッチするだけSetStaticIpAddress('Network card name','192.168.1.1','255.255.255.0');ですか?

別の言い方をすれば、私のケーキを食べて、最後にトライアウトでベストトライをすることは可能ですか?


[更新] #2 への答えはイエスのようです。このコードは両方のダイアログ ボックスを表示します ...

procedure TForm3.FormCreate(Sender: TObject);
  var x, zero : Integer;
begin
   zero := 0;
   try
      try
        x := 42 div zero;
      finally
         MessageDlg('Divide by zero finally', mtInformation, [mbOK], 0);
      end;

   Except
     on E: Exception do
     MessageDlg('Divide by zero exception handled', mtInformation, [mbOK], 0);
   end;
end;
4

1 に答える 1

5

どちらも例外処理に関連していますが、それらは異なる獣です。

試してみてください...最後に、リソースのクリーンアップです。ルーチンの最後にクリーンアップされるリソースを割り当てるときは、常に使用する必要があります。(ここでは「リソース」を広く解釈してください。ロックなどにも必要です。)

Try...Except は例外をキャッチするためのものです。妥当な処理方法がある例外が発生する可能性がある場合にのみ使用してください。トップレベルのエラー ログ機能の一部として以外に、すべての例外を単純に取得することはほとんどありません。(すべてをキャッチすべきではないとは言いません。たとえば、構成ファイルを読んでいて、それが悪い場合などです。唯一の実際の選択肢は、プログラムを中止するか、スコークするか、デフォルトを使用して続行することです。一般的に、ユーザーはおそらく後者。)

それらは任意の深さまで入れ子にすることができ (複数のリソースを割り当てる場合は、それらを入れ子にするか、リソースを解放する前にリソースが取得されたかどうかを確認する何らかの方法が必要です)、自由に共存できます。

于 2012-09-26T03:19:12.077 に答える