我尝试从另一个线程中捕获异常,但不能。
static void Main(string[] args)
{
try
{
Task task = new Task(Work);
task.Start();
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
Console.WriteLine();
}
public static void Work()
{
throw new NotImplementedException();
}
我也写了try-catch和方法,但没有任何反应。 请告诉我如何知道异常抛出?
也许你可以给我看一些示例代码。
答案 0 :(得分:1)
您的代码可能不会引发异常,因为main方法执行得太快并且进程将在您获得异常之前终止
这里看起来像你的代码
static void Main(string[] args)
{
Task task = new Task(Work);
task.Start();
var taskErrorHandler = task.ContinueWith(task1 =>
{
var ex = task1.Exception;
Console.WriteLine(ex.InnerException.Message);
}, TaskContinuationOptions.OnlyOnFaulted);
//here you should put the readline in order to avoid the fast execution of your main thread
Console.ReadLine();
}
public static void Work()
{
throw new NotImplementedException();
}
尝试查看ContinueWith
答案 1 :(得分:0)
TaskContinuationOptions枚举的OnlyOnFaulted成员 表示只有在执行时才执行继续 先前的任务引发了异常。
task.ContinueWith((Sender) =>
{
////This will be called when error occures
Sender.Result
}, TaskContinuationOptions.OnlyOnFaulted);
答案 2 :(得分:0)
你的尝试/捕获不会起作用。出于一个原因:因为在抛出异常之前你很可能已经离开了try块,因为Task在另一个线程上完成。
使用Task,有两种方法可以获得异常。
第一个是在try块中使用task.Wait();
。此方法将重新抛出任务抛出的任何异常。
然后,将在catch块中的调用线程上处理任何异常。
第二个是使用ContinueWith方法。这不会阻止你的调用线程。
task.ContinueWith(t =>
{
// Here is your exception :
DoSomethingWithYour(t.Exception);
}, TaskContinuationOptions.OnlyOnFaulted);
答案 3 :(得分:-1)
请注意,以下将阻止使用Wait
后的主线程。
try
{
Task task = Task.Factory.StartNew(Work);
task.Wait();
}
catch (AggregateException ex)
{
Console.WriteLine(ex.ToString());
}