C#等待并捕获异常

C#等待并捕获异常,c#,exception,asynchronous,C#,Exception,Asynchronous,我在这里看到很多人在谈论从异步函数捕获异常的方法,但我却一无所获 我使用了一些代码来制作IRC机器人: (由于异常是从WebException继承而来的,因此如果要进行测试,则应执行相同的操作) 所以我尝试了异步函数。例如,当RiotApi中的函数未找到用户时,getcourger(),404作为RiotSharpException抛出 try { RiotSharp.SummonerEndpoint.Summoner summoner = api.GetSummoner(region,

我在这里看到很多人在谈论从异步函数捕获异常的方法,但我却一无所获

我使用了一些代码来制作IRC机器人: (由于异常是从
WebException
继承而来的,因此如果要进行测试,则应执行相同的操作)

所以我尝试了异步函数。例如,当RiotApi中的函数未找到用户时,
getcourger()
,404作为
RiotSharpException
抛出

try
{
    RiotSharp.SummonerEndpoint.Summoner summoner = api.GetSummoner(region,name);
    SendSummonersDetails(summoner, e.Message.MessageTarget);
}
catch (RiotSharpException ex)
{
    string error = string.Format(this.RegionNotFound, command[2]);
    irc.Send(new IRCMessage("PRIVMSG", e.Message.MessageTarget, error));
}
我已经用了很多次了,我能赶上404。 但是如果我使用异步版本: 我是否喜欢

try
{
    RiotSharp.SummonerEndpoint.Summoner summoner = await api.GetSummonerAsync(region,name);
    SendSummonersDetails(summoner, e.Message.MessageTarget);
}
catch (RiotSharpException ex)
{
    string error = string.Format(this.RegionNotFound, command[2]);
    irc.Send(new IRCMessage("PRIVMSG", e.Message.MessageTarget, error));
}
或者对于任务,然后离开,try/catch不会捕获异常

我尝试了我在这里看到的一切:

我也尝试了使用TaskContinuationOptions的
continuew。只有出现故障的
也不起作用

我使用VS2013和框架4.5ish


我的自动取款机完全丢了,我用了这里所有的东西,但什么都没用,也许有人能想到什么

它似乎在2015 RC 4.6框架上运行良好。。。所以我将坚持这一点

尝试以下方法:

               try
               {
                    RiotSharp.SummonerEndpoint.Summoner summoner = await api.GetSummonerAsync(region,name);
                    SendSummonersDetails(summoner, e.Message.MessageTarget);
                }
                catch (AggregateException ex)
                {
                  foreach(Exception ee in ex.InnerExceptions)
                  {
                    RiotException e = ee as RiotException;
                    string error = string.Format(this.RegionNotFound, command[2]);
                    irc.Send(new IRCMessage("PRIVMSG", e.Message.MessageTarget, error));
                  } 

                 }

除非您尝试对返回的任务对象进行dosomething,否则异步版本中不会捕获异常。事实上,任务的Exception属性应提供AggregateException,该属性包含innerexception,该属性将包含您需要的特定异常。使用任何任务对象方法,如Result和catch,都会得到异常。这是TPL的行为。您在问题中包含的异步版本(即您等待操作的位置)应该像同步版本一样引发异常。如果没有,那就是您正在使用的RiotApi组件中的一个bug。如果没有,我看不到比这更具体的注释方法,更不用说回答问题了。您还可以捕获一般异常或聚合异常并进行检查,因为异步调用将引发聚合异常,而不是您预期的暴动异常,如前所述,您已经从itI加载了VS的RC2105中获得了异常,并且相同的代码运行良好。。。我不明白:(VS 13起作用。异步异常处理在数十万个生产部署中起作用。VS 15还没有准备好。与其假设在完成和可复制的代码以及完整的结果后会出现如此严重的问题,不如假设堆栈跟踪可能在AggregateException中包含异常2级,但没人能猜到我已经出现了异常。)ed,因为我在这里读过类似的5个错误。它不起作用,但它在4.6框架和VS 15中工作。我在某处读到VS 13不支持这一点,我开始相信这一点…但感谢您的帮助!实际上它在几十万部署中的生产中工作得非常好。您确实需要发布代码that复制错误-包括任何未处理的异常处理程序。可能只是您正在使用的项目有问题。如果您想查看它,我可以将整个VS项目发送给您。但是,我使用VS2015(我在2015年加载了确切的项目,并且它第一次工作)并不起作用现在,当我切换到2013年时,它就开始工作了。要么我是个大傻瓜(最有可能是……他,大多数错误来自椅子和键盘之间)要么我遇到了一个奇怪的错误,异步方法中的异常处理没有任何问题。很可能
getcallerasync
方法抛出的异常与您认为的不同。未处理的异常是我期望的异常(我也尝试了异常,这是根异常,应该可以工作)我在VS 2015上尝试了完全相同的代码,但效果很好。我说不出话来:(你所有的解决方案都很好,但都是在VS15上