8

私が維持しているいくつかのDelphi7コードでは、次の多くのインスタンスに気づきました。

with ADOQuery1 do begin
  // .. fill out sql.text, etc
  try
    execSQL;
  except
    raise;
  end;
end;

これらのtryブロックは何もしないので、削除できるように思えます。しかし、私は起こりうる微妙な副作用に警戒しています。

これらのブロックが実際にそれらなしでは起こらないことを行うことができるインスタンスを誰かが考えることができますか?

4

8 に答える 8

10

このコンテキストでは、raise操作は効果がなく、例外ブロックがキャッチしたばかりの例外を単に再発生させるため、削除する必要があります。通常、raiseは、適切なエラー処理が利用できない場合に、ブロックの最後に制御を移すために使用されます。以下では、カスタム例外を処理しますが、その他の例外は他の場所で処理する必要があります。

try
  someOperation;
except
  on e: ECustomException do
    SomeCustomHandelr;
  else
     begin
       // the raise is only useful to rethrow the exception to an encompasing 
       // handler.  In this case after I have called my logger code. as Rob
       // mentioned this can be omitted if you arent handling anything because
       // the compiler will simply jump you to the next block if there is no
       // else.
       LogUnexpectedException('some operation failed',e);
       raise;
     end;
end;

「レイズ」のない似たような形があり、例外を食べたり隠したりするという副作用があることに注意してください。うまくいけば競争のポジションに移動した非常に悪意のある開発者による練習。

with ADOQuery1 do begin  
  // .. fill out sql.text, etc  
  try    
    execSQL; 
  except
    // no handler so this just eats any "errors"    
  end;
于 2009-04-30T02:27:12.733 に答える
6

上記のコードスニペットの例外コードを削除しても、違いはありません。あなたはそれを取り除くことができます(そしてそれは読みやすさを低下させているのであなたがすべきだと私は信じています)。

于 2009-04-30T02:17:12.350 に答える
2

さて、ここで本当に2つの質問があります。

まず、それ意味があります。execSQLが例外をスローした場合、それはtryブロックによってキャッチされ、exceptに転送されます。次に、レイズによって次に高いブロックに転送されます。

第二に、それは役に立ちますか?おそらくそうではありません。これはほぼ間違いなく、次の3つのいずれかの結果です。

  1. とがった髪の人は、「例外をスローできるすべての操作はtryブロックに含まれている必要がある」というコーディング標準を作成しました。
  2. 誰かが戻ってきて、ステートメントによって行われた例外をexecSQL他のより意味のある例外に変えることを意図していました。
  3. 新しい人は、自分たちが書いたものが子宮環境に例外を心配させるのと同形であることに気づかなかったので、それを転送しなければならないと考えました。
于 2009-04-30T02:30:41.257 に答える
0

タイトルにはかなり幅広い質問が含まれていますが、その説明はより具体的な例を示しています。ですから、例からどのように進んでいくのかという質問への私の答えは、ここですでに述べたことに役立つものを間違いなく追加することができます。

しかし、おそらくBlorgbeardは、それがにまったく意味があるかどうかを知りたがっていtry ... except raise; endます。Delphi 7では、正しく再収集すると、ブロックの一部Exitがトリガーされます(ある種の例外であるかのように)。誰かがそのような振る舞いを彼らの仕事に不適切であると考えるかもしれません、そして問題の構造を使うことはかなりの回避策です。finallytry-finally

そこでシングルを使用するのはまだ奇妙なことですが、チャーリーがきちんと観察しているように、意味ではなく有用性raise;について話し合うべきでした。

于 2009-04-30T14:57:14.927 に答える
0

このコードは、この try except ブロックがなければ既に発生する例外を再発生させる以外には何もしません。安心して取り外せます。

于 2009-04-30T18:25:08.157 に答える