4

誰でも説明できますか、なぜブローコードから例外が発生しないのですか:

Action <Exception> myact = ( ) => {       
    throw new Exception( "test" );
  };

  Task myactTask = Task.Factory.StartNew( ( ) => myact);
  try {
    myactTask.Wait( );
    Console.WriteLine( myactTask.Id.ToString( ) );
    Console.WriteLine( myactTask.IsCompleted.ToString( ) );
  }
  catch( AggregateException ex ) {
    throw ex;
  }

一方、アクション「myact」をメソッド「myact()」に置き換えると、例外が発生し、try catch ブロックで処理できます。

public static void myact( ) {
  throw new Exception( "test" );
}
4

3 に答える 3

4
Task myactTask = Task.Factory.StartNew( ( ) => myact);

これはアクションを実行するのではなく、アクションへの参照を返す関数です。

Task myactTask = Task.Factory.StartNew(myact);

これにより、それが実行され、例外がスロー/キャッチされます。

于 2013-01-23T12:27:05.787 に答える
0

AggregateExceptionこれは、ではなくのみをキャッチしているために発生しますException。もう1つの問題は、でコードを実際に実行していないことですTask.Factory.StartNew

コードを次のように変更します。

Action <Exception> myact = ( ) => {       
    throw new Exception("test");
};

Task myactTask = Task.Factory.StartNew(myact);
try {
    myactTask.Wait();
    Console.WriteLine(myactTask.Id.ToString());
    Console.WriteLine(myactTask.IsCompleted.ToString());
}
catch(Exception ex) {
    throw ex;
}
于 2013-01-23T12:25:47.820 に答える
0

私はコードをコピーしましたが、コンパイルされませんでしたが、ほとんどの答えは正しいです。それはあなたが捕まえようとしているものにかかっています。

//Action<in Exception> : Make the delgate take an exception, then throw it
Action<Exception> myact = (ex => { throw ex; });
//Pass a new Exception with the message test "Test" that will be thrown
Task myactTask = Task.Factory.StartNew(() => myact(new Exception("Test")));
try
{
  myactTask.Wait();
  Console.WriteLine(myactTask.Id.ToString());
  Console.WriteLine(myactTask.IsCompleted.ToString());
}
catch (Exception ex)
{
  //Writes out "Test"
  Console.WriteLine(ex.Message);
  throw ex;
}
于 2013-01-23T12:31:17.893 に答える