社区首页 >问答首页 >如何捕获异步HttpClient调用中的所有异常?

如何捕获异步HttpClient调用中的所有异常?
EN

Stack Overflow用户
提问于 2019-09-21 01:57:28
回答 2查看 1.3K关注 0票数 0

我有以下下载网页的功能:

代码语言:javascript
代码运行次数:0
复制
    static bool myFunction(int nmsTimeout, out string strOutErrDesc)
    {
        //'nmsTimeout' = timeout in ms for connection
        //'strOutErrDesc' = receives error description as string
        bool bRes = false;
        strOutErrDesc = "";

        HttpClient httpClient = null;
        System.Threading.Tasks.Task<string> tsk = null;

        try
        {
            httpClient = new HttpClient();
            tsk = httpClient.GetStringAsync("https://website-to-connet.com");

            if (tsk.Wait(nmsTimeout))
            {
                if (tsk.Status == System.Threading.Tasks.TaskStatus.RanToCompletion)
                {
                    string strRes = tsk.Result;
                    strRes = strRes.Trim();

                    if (!string.IsNullOrWhiteSpace(strRes))
                    {
                        bRes = true;
                    }
                    else
                    {
                        //Empty result
                        strOutErrDesc = "Empty result";
                    }
                }
                else
                {
                    //Bad task completion
                    strOutErrDesc = "Bad completion result: " + tsk.Status.ToString();
                }
            }
            else
            {
                //Timed out
                strOutErrDesc = "Timeout expired: " + nmsTimeout + " ms.";
            }
        }
        catch (Exception ex)
        {
            //Error
            strOutErrDesc = "Exception: " + ex.Message;
            if (tsk != null)
            {
                strOutErrDesc += " -- ";
                int c = 1;
                foreach(var exc in tsk.Exception.InnerExceptions)
                {
                    strOutErrDesc += c.ToString() + ". " + exc.InnerException.Message;
                }
            }

            bRes = false;
        }

        return bRes;
    }

我认为我的try/catch构造足够捕获其中的所有异常。

直到我发现了以下异常和该应用程序崩溃的Windows错误消息:

未处理异常: System.AggregateException:通过等待任务或访问其异常属性没有观察到任务的异常。因此,未观察到的异常由终结器线程重新引发。-> System.Net.Http.HttpRequestException:响应状态代码并不表示成功: 503 (服务不可用)。

-内部异常堆栈跟踪结束

在System.Threading.Tasks.TaskExceptionHolder.Finalize()

这是什么,我怎么抓住它?

EN

回答 2

Stack Overflow用户

发布于 2019-09-21 02:05:35

这个应用程序崩溃了,因为try/catch不是“到处抓它”的黑客,它只捕获在同一个调用堆栈上抛出的异常或相同的调用上下文。

另一方面,由于某种原因,您使用同步方法启动异步任务,这些任务在其他线程上运行,它们的上下文将丢失。

要么使用这些方法的同步版本,要么在异步任务上使用异步方法和await,这将保留调用上下文,并允许您捕获try/catch块内部抛出的任何异常。

票数 0
EN

Stack Overflow用户

发布于 2019-09-21 02:16:19

请注意,这里描述的是一种旧的行为(如注释中所述),并且它不会发生在.NET 4.5和更新版本中。

正在发生的情况是,任务没有成功完成,您也没有检查错误。当垃圾收集器试图清理Task对象时,它会在那里找到未处理的异常并将其抛入AggregateException中。这就是异常并没有实际抛出在try块中(甚至在不同的线程上),因此捕获无法捕获它。

您想要做的是正确地await创建的任务。此时,您可能希望在C#中阅读异步/等待。如果您希望任务是可取消的,您可能必须使用GetAsync和取消令牌,否则您将不得不等待GetStringAsync在某个时候完成。

如果您出于某种原因不想使用异步等待方式(您应该这样做!),您仍然可以使用tsk.Wait();。但是,这将将抛出的异常包装在AggregateException中,调用将是同步的

如果您真的不能停留在周围等待您的函数完成,您可以在this question中看到如何使用延续任务自动处理异常检查。

但是,我确实建议您使用异步/等待,并适当地检查任务是如何完成的,以及它们抛出了什么。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58039183

复制
相关文章
【Python】异常处理 ③ ( 捕获所有类型的异常 | 默认捕获所有类型异常 | 捕获 Exception 异常 )
使用 try-except 语句 , 不指定异常类型 , 默认就可以捕获所有类型的异常 ;
韩曙亮
2023/10/11
2.1K0
【Python】异常处理 ③ ( 捕获所有类型的异常 | 默认捕获所有类型异常 | 捕获 Exception 异常 )
HttpClient的异步调用,你造?
HttpClient提供了两种I/O模型:经典的java阻塞I/O模型和基于Java NIO的异步非阻塞事件驱动I/O模型。
加多
2020/06/16
4.2K0
Python捕获所有异常
老生常谈了,但是在Pyflake检查出E722错误时有时候又犯老毛病。人年纪大了越来越有老年痴呆倾向 -_- …..
happy123.me
2019/12/30
3.6K0
精读《捕获所有异步 error》
成熟的产品都有较高的稳定性要求,仅前端就要做大量监控、错误上报,后端更是如此,一个未考虑的异常可能导致数据错误、服务雪崩、内存溢出等等问题,轻则每天焦头烂额的处理异常,重则引发线上故障。
黄子毅
2022/03/15
8130
python中的异常捕获
无论是编程新手还是老手,都会遇到过程序报错,终止执行的情况,对于python的报错信息,可以分为以下两大类
生信修炼手册
2020/05/28
1.9K0
go 如何捕获异常
什么是异常? 不按照我们期望执行的都可以称之为异常 在Go语言中如何处理异常? 一种是程序发生异常时, 将异常信息反馈给使用者 一种是程序发生异常时, 立刻退出终止程序继续运行 将异常信息反馈给使用者
王小明_HIT
2021/07/05
1.4K0
Flask中异常捕获
HTTP 异常主动抛出 abort 方法 抛出一个给定状态代码的 HTTPException 或者 指定响应,例如想要用一个页面未找到异常来终止请求,你可以调用 abort(404)。 参数: code – HTTP的错误状态码 # abort(404) abort(500)   抛出状态码的话,只能抛出 HTTP 协议的错误状态码  捕获错误 errorhandler 装饰器 注册一个错误处理程序,当程序抛出指定错误状态码的时候,就会调用该装饰器所装饰的方法 参数: code_or_ex
汪凡
2019/03/01
1.7K0
调用线程不可捕捉异步线程的异常,如何处理?
Java的异常在线程之间不是共享的,在线程中抛出的异常是线程自己的异常,主线程并不能捕获到。也就是说你把线程执行的代码看成另一个主函数:
名字是乱打的
2021/12/24
2.3K0
如何在SpringBoot中异步请求和异步调用
可以先释放容器分配给请求的线程与相关资源,减轻系统负担,释放了容器所分配线程的请求,其响应将被延后,可以在耗时处理完成(例如长时间的运算)时再对客户端进行响应。
架构师修炼
2020/07/20
2K0
如何在SpringBoot中异步请求和异步调用
如何在SpringBoot中异步请求和异步调用
链接 | cnblogs.com/baixianlong/p/10661591.html
JavaFish
2020/02/19
1.6K0
如何在SpringBoot中异步请求和异步调用
[javaSE] 异常捕获
异常:程序在运行时出现的不正常现象 Throwable |——Error |——Exception 严重级别:Error类和Exception类 异常的处理:try{}catch{}finally{} public class VariableDemo { /** * @param args */ public static void main(String[] args) { try { System.out.println(1
唯一Chat
2019/09/10
1.5K0
如何使用 Sentry 捕获前端异常
英文 | https://javascript.plainenglish.io/how-to-catch-frontend-exceptions-with-sentry-34773b026ced
coder_koala
2022/11/28
1.5K0
如何使用 Sentry 捕获前端异常
Java中的异常Exception和捕获,自定义异常
 在使用计算机语言进行项目开发的过程中,即使程序员把代码写得尽善尽美,在系统的运行过程中仍然会遇到一些问题,因为很多问题不是靠代码能够避免的。
鱼找水需要时间
2023/04/23
1.9K0
Java中的异常Exception和捕获,自定义异常
springboot中全局异常捕获类的写法
全局异常捕获:      当你访问页面出错时,默认是400或500以   及以一大串英文,自己写了全局异常捕获 类就可以在显示自己写的内容。   写法如下:  图片发自简书App 这样在页面
贪挽懒月
2018/05/18
1.8K0
NodeJS的异常捕获
由于nodejs是非阻塞单进程单线程的,一旦nodejs抛出异常,整个服务就会停掉。服务将会非常不稳定。
码客说
2021/09/01
6K0
异常捕获中finally和return的用法
 try..catch...finally结构中,当 try 或 catch 语句块中带有 return 时,程序的执行顺序会是什么样?
头发还在
2022/11/13
7860
用Exception类捕获所有异常的技术是怎么用的?
马克-to-win:注意,一个事实是:Exception类是所有其他异常类的父类,所以Exception类能捕获所有的异常。马克-to-win:问题是用Exception来捕获所有的异常,这个技术有什么好处和缺点?好处就是:不管发生什么异常,都能进入Exception catch块儿,这样,程序都不崩溃。马克-to-win:缺点就是:不能根据特定的异常做特定的处理。马克-to-win:比如,对于以上例子,我们可以用以下的技术,Exception来捕获所有的异常,都可以达到程序不崩溃的目的。马克-to-win:因为Exception是所有其他异常的父类。
马克java社区
2021/04/07
4900
用Exception类捕获所有异常的技术是怎么用的?
java主线程捕获子线程中的异常
如果想要在主线程中捕获子线程的异常,我们需要使用ExecutorService,同时做一些修改。
Java架构师必看
2021/05/14
3K0
java主线程捕获子线程中的异常
Java中多个异常的捕获顺序(多个catch)
import java.io.IOException;   public class ExceptionTryCatchTest {       public void doSomething() throws IOException{           System.out.println("do somthing");       }       public static void main(String[] args){           ExceptionTryCatchTest etct = new ExceptionTryCatchTest();           try {               etct.doSomething();           } catch (Exception e) {                          } catch (IOException e) {                          }       }      }
用户7886150
2021/04/25
3.8K0
python – 异常捕获
直接上示例: 大概的意思就是当try下方的代码出现异常的时候就自动执行except下方的代码
Blank.
2023/04/12
1.3K0

相似问题

如何正确捕获多个异步方法调用中的异常?

25

在任务中捕获异步HttpWebRequest调用的异常

20

httpclient.GetStringAsync(url)异步api调用的异常处理

10

捕获调用异步方法C#的异常

15

HttpClient异步方法,聚合异常

22
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文