3

これは私が以前に何度か気づいた行動であり、その背後にある理由を知りたいと思います。(Visual Studio 2008)デバッガーで次のプログラムを実行すると、デバッグを継続する頻度に関係なく、デバッガーはthrowステートメントを中断し続けます。そこにたどり着くには、デバッグを停止する必要があります。デバッガーを使用せずにプログラムを実行すると、デバッガーが1回中断してから、プロセスが終了することが予想されます。誰かがこの振る舞いの正当な理由を知っていますか?

using System;

namespace ExceptionTest
{
   static internal class Program
   {
      static internal void Main()
      {
         try
         {
            throw new Exception();
         }
         catch (Exception exception)
         {
            Console.WriteLine(exception.Message);

            // The debuger  will never go beyond
            // the throw statement and terminate
            // the process. Why?
            throw;
         }
      }
   }
}
4

3 に答える 3

2

未処理の例外をステップオーバーすると、プロセスが終了します。おそらく、意図しないときに誤ってプロセスを終了するのを防ぐためです。

例外が他の場所(一般的な外部のtry-catchブロックなど)で処理される場合は、例外をステップオーバーでき、デバッガーによって処理される場所に移動します。

于 2009-10-08T10:43:18.863 に答える
1

プロセスを強制終了する場合は、[停止]ボタンを使用してください。アプリケーションを停止すると確かに役立つ場合があります。デバッガーがアプリケーションの強制終了を要求しない理由は、プログラマーがスローされた例外のコンテキストでプログラムの状態を調べたり、プログラムが続行できるように物事を「微調整」したりする場合があるためです。ファイナライザーが実行される前にデバッガートラップが発生することに注意してください。これにより、ファイナライズ中に破棄されるプログラム状態の側面を調べることができます。

また、「キャッチされない例外」デバッガトラップをトリガーするが、プログラムを終了しない例外が発生する可能性があることにも注意してください。たとえば、次のようなことができます。

クラスexTest
    クラスmyException
        例外を継承する
        Sub New(ByVal innerException As Exception)
            MyBase.new( "ラップされた例外"、innerException)
        サブ終了
    エンドクラス
    共有関数CopyArg1ToArg2AndReturnFalse(Of T)(ByVal arg1 As T、ByRef arg2 As T)As Boolean
        arg2 = arg1
        Falseを返す
    終了機能
    共有サブtestIt()
        例外としてのDimtheException= Nothing
        試す
            試す
                新しいApplicationExceptionをスローします
            CopyArg1ToArg2AndReturnFalse(ex、theException)の場合にexを例外としてキャッチ
                投げる
            ついに
                例外が何もない場合は、新しいmyException(theException)をスローします
            終了試行
        exをmyExceptionとしてキャッチ
            Debug.Print( "例外:"&ex.InnerException.ToString)
        終了試行
    サブ終了
エンドクラス

システムは、Finally句が例外によってトリガーされる前に、誰もApplicationExceptionをキャプチャしないことを決定します。ただし、例外がスローされた場合、Finally句は、それ自体の新しい例外(キャッチされる新しい例外)をスローすることにより、その特定の例外がエスケープされるのを防ぎます。

このトリックは、一部の例外が内部レベルでトラップされて処理され(ユーザーエクスペリエンスを中断することなく)、他の例外が外部レベルでトラップされる(エラーメッセージを表示するなど)状況でのデバッグに役立つ場合があります。外側のレベルでのみトラップされる例外は、発生時にデバッガートラップを生成しますが、内側のレベルでトラップされる例外は、プログラムを続行できるようにします。

于 2010-11-29T17:19:08.580 に答える
0

処理せずに「トップ」までバブルする例外を通過することはできません。本当に必要な場合は、これを試してください。

static internal void Main()
        {
            try
            {
                throw new Exception();
            }
            catch (Exception exception)
            {
                Console.WriteLine(exception.Message);

                // The debuger  will never go beyond
                // the throw statement and terminate
                // the process. Why?
                Environment.FailFast("Oops");
                throw;
            }
        }
于 2009-10-08T10:38:59.447 に答える