首页 新闻 会员 周边

Task捕获异常的问题

0
悬赏园豆:20 [已解决问题] 解决于 2017-06-27 17:58

先上代码:

using System;
using System.Threading.Tasks;
public class Program
{
public static void Main()
{
Task task = Task.Run(() =>
{
throw new InvalidOperationException();
});
try
{
task.Wait();
}
catch(AggregateException exception)
{
exception.Handle(eachException =>
{
Console.WriteLine(
"ERROR: {0}",
eachException.Message);
return true;
});
}
}
}

 

提问:这段代码我在vs2013中可以正常运行并且进入到catch块中的异常处理,最终会显示错误的字符串,但是同样这段代码,我在vs2017中运行测试会直接弹出异常,求解!!!

wall-ee的主页 wall-ee | 初学一级 | 园豆:159
提问于:2017-06-26 15:02
< >
分享
最佳答案
0

接楼上的。 把catch (AggregateException e) 换成 catch(Exception e)

收获园豆:20
czd890 | 专家六级 |园豆:14412 | 2017-06-26 23:11

在vs2017中无论是运行.net core的console还是.net framework 的console都会提示这个

wall-ee | 园豆:159 (初学一级) | 2017-06-27 17:07

我理解的是能在catch中捕获并显示一些错误的信息

wall-ee | 园豆:159 (初学一级) | 2017-06-27 17:15

@wall-ee: 

try{

Task task=new Task().....

task.wait()

}catch(exception)

 

可好?

czd890 | 园豆:14412 (专家六级) | 2017-06-27 17:18

@czd890: 没有解决。task没有start的话wait他干嘛?

wall-ee | 园豆:159 (初学一级) | 2017-06-27 17:28

@wall-ee: Task.Run 不久自动start了啊。

czd890 | 园豆:14412 (专家六级) | 2017-06-27 17:29

调试模式。catch加个断点。在按个F5.

czd890 | 园豆:14412 (专家六级) | 2017-06-27 17:35

@czd890: task.run的话还用new task干嘛?新手不懂,万望谅解

wall-ee | 园豆:159 (初学一级) | 2017-06-27 17:39

@czd890: 我试试

wall-ee | 园豆:159 (初学一级) | 2017-06-27 17:39

@wall-ee:  new 出来的task 是没有启动的。可以你代码控制随时start。

。run出来的,自动加入任务池等待执行了。

czd890 | 园豆:14412 (专家六级) | 2017-06-27 17:41

@czd890: 

 

 

wall-ee | 园豆:159 (初学一级) | 2017-06-27 17:44

@czd890: task.Wait();这句就抛出异常了啊。。

wall-ee | 园豆:159 (初学一级) | 2017-06-27 17:44

@wall-ee: 你在你的Console.WriteLine 上面放个断点。出现你上面截图的样子的时候,在按个F5

czd890 | 园豆:14412 (专家六级) | 2017-06-27 17:45

 

设置完了。就自动跳了

czd890 | 园豆:14412 (专家六级) | 2017-06-27 17:49

@czd890: 再按F5能在console里面显示错误,但在vs2013中是会被catch块直接捕获并处理错误的。vs2017为什么是这样的呢?

wall-ee | 园豆:159 (初学一级) | 2017-06-27 17:54

@wall-ee: 参考上一个回复截图

czd890 | 园豆:14412 (专家六级) | 2017-06-27 17:54

@czd890: 谢谢,明白了。

wall-ee | 园豆:159 (初学一级) | 2017-06-27 17:57
其他回答(2)
0

你把上面的run也放进try里就行了

throw的时候这边不一定wait()已经执行了.

吴瑞祥 | 园豆:29449 (高人七级) | 2017-06-26 15:11
 try
            {
                Task task=Task.Run(()=>
                {
                   throw new InvalidOperationException();
                });
            }
            catch (AggregateException e)
            {
              e.Handle(eachException =>
              {
                  Console.WriteLine(eachException.Message);
                  return true;
              });
            }

这样也不行,问题还是在于我用vs2013和vs2017运行同一段代码得出的结果不一样。求解

支持(0) 反对(0) wall-ee | 园豆:159 (初学一级) | 2017-06-26 15:18

哦上面的代码少了task.Wait();实际上是有的。

支持(0) 反对(0) wall-ee | 园豆:159 (初学一级) | 2017-06-26 15:19

@wall-ee: 一个能进catch.一个不能进?

支持(0) 反对(0) 吴瑞祥 | 园豆:29449 (高人七级) | 2017-06-26 15:47

@吴瑞祥: 是的,一个能进catch(vs2013),一个直接抛出异常(vs2017)

支持(0) 反对(0) wall-ee | 园豆:159 (初学一级) | 2017-06-26 15:48

@wall-ee: 你catch(Exception exception)试试

支持(0) 反对(0) 吴瑞祥 | 园豆:29449 (高人七级) | 2017-06-26 15:57

@吴瑞祥: 还是不行,您有空的话在vs2017上面帮我看一下,谢谢

支持(0) 反对(0) wall-ee | 园豆:159 (初学一级) | 2017-06-26 16:11
0

上面写的都是没问题的,你的vs2103和vs2017也是没有问题的,按照你说的vs2013和vs2017只是针对你项目中的错误处理方式不同,应该是2013里面让你自己的try catch去处理而vs2017它监测到走到了异常位置选择停下来让开发者可以快速知道已经到了异常位置了,如果这个时候你继续执行 按下F10 它应该会走到catch代码块中

叶帅辉 | 园豆:277 (菜鸟二级) | 2019-11-11 16:45
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册