0

.Net フレームワークのバージョン: 3.5

生成される可能性のあるすべての例外を処理するプログラムがあります。これにより、多数の catch ブロックが生成され、その多くはあるメソッドから別のメソッドへの重複です。すべての catch 処理を 1 つのメソッドにまとめたいと考えています。例えば:

string catch_processing ( Exception  e )
    {

    }

この例では、メソッドはe.Messagee.StackTraceおよび関連するその他の情報を返します。私の問題はその「その他の情報」です。次のような例外を区別したい

switch ( e )
    {
    case PathTooLongException:
        :
        break;

    case DirectoryNotFoundException:
        :
        break;

    default:
        :
        break;
    }

このメソッドを実装する方法がわからないので、いくつかのガイダンスをいただければ幸いです。

4

5 に答える 5

1

静的メソッドがCodeReviewに投稿されましたTryCatchLog。これは、あなたがやろうとしていると思うことを実行します。exceptionSubscriber.TryCatchLog(Statements...)によってスローされた例外をキャッチしStatements...、それらをに記録してexceptionSubscriber、再スローします。

ただし、そのコードをコピーする前に、停止して、達成しようとしていることを説明してください。「プログラムではすべての例外を報告する必要があります」は、ランタイムが何もしなくても未処理の例外をすでに報告しているため、非常に疑わしいステートメントです。もう1つの非常に疑わしいことは、にthrowステートメントがないことcatch_processingです。

例外がスローされた後、続行しようとはしていませんね。ON ERROR GOTO間違いである時代のベテランからそれを取ってください。例外の後で続行しようとするプログラムは失敗する傾向があり、デバッグが非常に困難です。彼らは例外をスローし、続行し、間違った結果を表示し、続行し、データを破損し、続行し、エラーのカスケードを開始します。これらはすべてログに記録され、続行し、ディスクをいっぱいにし、続行し、マシンをロックし、続行します。彼らが最終的に無限ループに入るまで。それをデバッグして楽しんでください。

于 2013-01-31T18:16:58.977 に答える
1

例外を報告することが唯一の目標である場合は、おそらく次のことを試すことができます

public class Foo
{
  static void Main(string[] args)
  {
     var domain = AppDomain.CurrentDomain;
     domain.FirstChanceException += new EventHandler<FirstChanceExceptionEventArgs>(CurrentDomain_FirstChanceException);
  }

   static void CurrentDomain_FirstChanceException(object sender, FirstChanceExceptionEventArgs args)
    {
       //If you are not putting this inside a try finally block then this would become an infinite recursion.
        try
        {
            var actualException = args.Exception;
            Console.WriteLine(actualException.ToString());
            //Do whatever with actualException

        }
        finally
        {

        }
    }
}
于 2013-01-31T18:31:43.977 に答える
0

instanceofを使用して、それがどのタイプの例外であるかを判別します。他の人がコメントしているように、例外処理戦略を再考する必要があると思います。

于 2013-01-31T17:42:31.087 に答える
0

@Soundarajanの後、私は答えを次のように実装しました:

    static string catch_processing ( Exception  e )
        {
        StringBuilder   sb = new StringBuilder ( );

        try 
            { 
            throw e; 
            } 
        catch ( PathTooLongException )
            {
            sb.Append (
                "Supplied path is longer than the system-" +
                "defined maximum length" );
            }
        catch ( ArgumentException )
            {
            sb.Append (
                "Supplied path contains invalid characters, " +
                "is empty, or contains only white spaces" );
            }
        catch ( UnauthorizedAccessException )
            {
            sb.Append (
                "The caller does not have the " +
                "required permission" );
            }
        : other catch blocks

        sb.AppendFormat ( "{0}{1}{2}{3}",
                          Environment.NewLine,
                          e.Message,
                          Environment.NewLine,
                          e.StackTrace );

        return ( sb.ToString ( ) );
        }
于 2013-01-31T19:13:09.257 に答える
0

あなたは本当にそれを必要としません:

AppDomain.CurrentDomain.UnhandledException += SomeExceptionHandler;

スコープ内で発生するすべての例外を処理しAppDomainます (複数の を扱っていない場合、これは基本的にアプリケーション全体ですAppDomain

次に、厳密に型指定された方法 ( または へのキャストなど) で例外型を取得しようとする代わりに、"System.XXXXExceptionリフレクション"System.YYYYException"を使用して例外オブジェクトのオブジェクト グラフ全体を取得し、それをログに記録できます (または必要なエラー報告を行うことができます)。 .

于 2013-01-31T18:24:16.443 に答える