2009-07-30 14 views
3

.NETにはDelphiのEAbortと同様の例外がありますか?.NETにはDelphiのEAbortと同様の例外がありますか?

現在、私は例外を継承する自分自身の "AbortProcess"を定義しています。 "AbortProcess"を無視するMy.Application.UnhandledExceptionハンドラと一緒に .NETの類似のメカニックが既に存在するかどうかは疑問です。

Class AbortProcess 
    Inherits System.Exception 
End Class 

Sub Abort() 
    Throw New AbortProcess() 
End Sub 

Sub AppDomain_UnhandledException(ByVal sender As Object, ByVal e As ApplicationServices.UnhandledExceptionEventArgs) 
    If TypeOf e.Exception Is AbortProcess Then 
     e.ExitApplication = False 
    End If 
End Sub  

Sub PerformActions() 
    Action1() 
    If Not Action2() Then 
     Abort() 
    End If 
    Action3() 
    ... 
End Sub 

どのように典型的な.NET開発者がこのユースケースを処理しますか?

更新日:人々の数投票ダウンいくつかの理由から

この質問を、残念ながら、任意のコメントを与えることなく。私が把握できる唯一の理由は、Exceptionを決してプログラムの流れを制御するために使うべきではないと考えていることです。私はそれに同意する傾向があります。しかし、私は最近、ANTLRを研究し、実際にコントロールフロー構造としてカスタムException(RecognitionException)を使用していることを確認します。 PythonのStopIterationの使用法と合わせて、Exceptionをコントロールフロー構造として使用することは、実際にはすでに広く使われていると思います。 Delphi VCLのように標準化されていないだけです。

+0

Yike!誰が私に下投票を与えるのですか?!?!?!?私は.NETプログラミングを入力しようとするDelphiのプログラマーです。私は.NETから欠落しているDelphiのコンセプトを見つけました。ここで正しい方法を求めています。それのどこが悪いんだい ?!?!?!? – Sake

答えて

5

DelphiのEAbort例外クラスを定義する2つの性質があります。それは、そのクラスの例外が発生している検出されたとき

  1. IDEがにあらかじめ設定されていない来ては、あなたのプログラムを中断します。
  2. メインアプリケーション例外ハンドラはEAbortとその子孫を認識し、このような例外をキャッチすると通常のメッセージボックスを表示しません。

あなたが提案したコードが2番目の部分を達成しているようです。 Visual Studioを最初の部分に設定することができます。別のスタックオーバーフローの質問への答えを参照してください。Is there a better way to get Visual Studio to ignore try/catch in debug mode?私は、すでにそのために指定されている例外クラスについて認識していません。

EAbort例外は、プログラムが実行中のイベントハンドラまたはメッセージハンドラを停止し、メインメッセージループで再開させることを目的としています。しかし、実際に動作させるためには、他のすべてのコードを記述して例外を適切に処理する必要があります。つまり、彼らは安定した一貫性のある状態を保つために、finallyセクションを使用する必要があり、本当に修正できない例外を再現するか、決して捕まえる必要がありません。

+0

あなたは男です。 :) – Sake

0

私が知っているだけであるThreadAbortExceptionある「コールがAbortメソッドに行われたときにスローされる例外は、」あなたはネットですぐにアプリケーションを終了したい場合は

0

は例外があります最高の道ではありません。明示的にスローした例外は、捕捉して飲み込むことができます。右のトリックを実行すると、ThreadAbortExceptionのような危険な例外も検出されます。

すぐにアプリケーションを終了する最も良い方法は、Environment.Exitを使用することです。

スタックオーバーフローのシナリオを作成するのは、CLR(カスタムホストを指定しない)によってスローされたときに、検出できない例外であるためです。

+0

コード例から分かるように、この仮説的な例外は明示的に*アプリケーションの終了を意図したものではありません。これは、現在のイベントハンドラを中止し、メッセージループに戻ることを意味します。 –

0

これは、基本的に機能からの簡単な終了として機能するだけの例外です。 .NETの例外はそれを意図したものではなく、それらを飲み込むことは非常に悪い習慣です。

データフローの処理には例外を使用しないでください。何かが失敗すると思われる場合は、例外をスローすることができますが、最初は適切なタイミングでキャッチします。例外をUnhandledException関数に落として、それを飲み込むと、例外が発生するすべてのメソッドが "中止"されるため、アプリケーションを未知の状態にする可能性があるという悪い習慣があります。この場合

は、あなたがそのサブで例外が必要な場合、私はコールでそれをキャッチします:

try { 
    PerformActions() 
} catch (AbortProcess) { 
    //do some cleaning up or just ignore 
} 

例外がそれに近い捕捉され、この方法は、原点だし、任意のクリーンアップは、その機能に制限されていますのみ。他のすべての例外はUnhandledException関数に渡されます。ここでは、エラーを報告してアプリケーションを閉じることができます。

関連する問題