如何从 c# 中包含匿名方法的操作中捕获异常
本文关键字:方法 操作 捕获异常 包含匿 | 更新日期: 2023-09-27 17:55:16
谁能解释一下,为什么我没有从打击代码中得到异常:
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" );
}
Task myactTask = Task.Factory.StartNew( ( ) => myact);
这不会执行您的操作,它是一个返回对您的操作的引用的函数。
Task myactTask = Task.Factory.StartNew(myact);
这将执行它并抛出/捕获异常。
发生这种情况是因为您只捕获了AggregateException
而不是Exception
。另一个问题是你并没有真正在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;
}
我复制了代码,它没有编译,但是大多数答案都是正确的,这取决于您要捕获的内容。
//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;
}