更新履歴:その2
更新時間: 2001-10-21 02:42
更新者: Musicwind®
更新メモ: 形式が変更されました。
更新履歴:No.1
更新時間: 2001-10-19 21:15
更新者: Musicwind®
更新メモ: 作成されました。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~
はじめに: 私は Delphi に没頭して3 年以上になりますが、Delphiのヘルプ ドキュメントを読むたびに得るものが多く、 Delphi の広さにため息をつかずにはいられません。恥ずかしく思いますが、私は自分の経験と得たものをいくつか整理し、私と同じように傲慢で知識が浅い人たちに私の励ましを分かち合いたいと思います。
1.サイレント例外とは何ですか? (なぜ羊たちの沈黙を使わないのでしょうか? ;- ))
サイレント例外、つまりSlient Exceptions は、デフォルトで煩わしいメッセージ プロンプトを表示しない例外タイプ( EAbort )を指します。 Object Pascal では、例外クラスEAbort はすべてのサイレント例外クラスの祖先クラスです (EAbort は Exception を継承します)。 EAbort を発生させると、最も外側の例外処理モジュールが実行モジュールをインターセプトするまで実行モジュールが停止しますが、赤い停止標識の付いたメッセージ ボックスは表示されません。次のコードを参照してください。
試す
ShowMessage('Hello1');
Raise EAbort.Create('中止');
ShowMessage('Hello2');
を除外する
E: 例外実行
showmessage('例外時');
終わり;
実行結果には、「Hello1」と「On Exception」の 2 つのメッセージ ボックスが表示されます。これは、EAbort が「ShowMessage('Hello2')」ステートメントをスキップすると同時に「中止します」メッセージ ボックスが表示されないため、機能することを示しています。また、ダイアログが表示されないという EAbort 例外クラスの機能も確認されています。ボックスが表示されます (これは設計中にも当てはまります)。また、「例外時」というメッセージ ボックスは、EAbort が通常の例外とは異なる異常である可能性があることを示しますが、古い Try-Except ステートメントを使用してそれを捕捉することはできません。 。
2. EAbort を使用する理由
EAbort は特定の状況で役立ちます。たとえば、操作を終了する必要があるが、ユーザーに気づかれたくない場合 (デフォルトの例外メッセージ ボックスを表示したくない場合)。もちろん、同じ効果を達成するために、通常の例外を使用することもできます (たとえば、Try-Except 文パターンを使用し、コードを Try セクションに置き、操作を終了する必要がある場合は例外を発生させ、次のようには記述しません)ただし、EAbort を使用するほど単純かつ直接的なものはありません。
3.もっと簡単なものはありますか? --中止プロセスの使用
SysUtils ユニットで定義されたプロセスである Abort を使用すると、EAbort を便利に使用できます。 Abort の実装ソース コードを表示します。
手順を中止します。
関数 ReturnAddr: ポインタ;
アズム
MOV EAX、[EBP + 4]
終わり;
始める
ReturnAddr で EAbort.Create(SOperationAborted) を発生させます。
終わり;
ここでの SOperationAborted は、通常は「操作が中止されました」です。
4.ベールを脱ぐ – 実施原則
おそらくあなたも、私と同じように、EAbort が沈黙している理由に興味があるかもしれません。 Delphi は EAbort に対して内部的に何をしましたか?一緒に調べてみましょう。
新しいプロジェクトを開き、「ファイル内で検索」をクリックし、「EAbort」キーワードを入力して、「ディレクトリ内で検索」ラジオ ボタンを選択し、「ディレクトリ検索オプション」の「ファイル マスク」編集ボックスを、Delphi ソース コードが存在するディレクトリ名に設定します(例:私のものとして、はい: D:Program FilesBorlandDelphi6Source)、[サブディレクトリを含める] をオンにすることを忘れないでください。最後に「OK」をクリックして検索を開始します。
その結果、Delphi のソース コードには EAbort に関連する箇所が17箇所もあることが判明しました。 EAbort の 2 つの宣言と Sysutils ユニット内のいくつかのコメント ステートメントを除いて、コードの大部分は次のように類似していることがわかりました。
ExceptObject が EAbort の場合
同様に:
そうでない場合 (E は EAbort)、
等
これらはすべて、 RTTIに基づいて EAbort を特別に処理します。EAbort の実装は非常に簡単であることがわかります。
注目に値する 2 つのユニットは、Forms (Linux バージョンは QForms) と AppEvnts です。前者のコードで質問に対する答えを見つけるのは簡単です。 Delphi のソース コードを参照してください。
プロシージャ Tapplication.HandleException(送信者: TObject);
始める
if GetCapture <> 0 then SendMessage(GetCapture, WM_CANCELMODE, 0, 0);
ExceptObject が例外の場合
始める
そうでない場合 (ExceptObject が EAbort である)
割り当て済み(FOnException)の場合
FOnException(送信者、例外(ExceptObject))
それ以外
ShowException(Exception(ExceptObject));
それ以外で終了
SysUtils.ShowException(ExceptObject, ExceptAddr);
終わり;
5. Abort 、 Break 、 Exitの違い
Abort、Break、Exit は似ていますが、大きく異なります。 Break は、ループ ステートメント内のループから抜け出すために使用されます。 Exit は、現在実行中の関数本体 (またはプロセス本体) から飛び出すために使用されます。アボートを使用すると、例外をキャッチするコードが存在するまで、1 つ以上のコード層からジャンプできます。
6.サイレント例外をカスタマイズする
通常の例外クラスのサブクラスを宣言するのと同じように、EAbort とそのサブクラスを祖先クラスにするだけです。
TMyException = クラス(EAbort);
TNextException = クラス(EAbort);
等
Musicwind®@杭州、浙江省、中国
2001-10-20
その他の記事
[記事の終わり]