在WebClient请求期间发生异常C#,怎么解决(curseforge在webclient请求期间发生异常)

c 在WebClient 请求期间发生异常

style="text-indent:2em;">很多朋友对于在WebClient请求期间发生异常C#,怎么解决和oom异常解决办法不太懂,今天就由小编来为大家分享,希望可以帮助到大家,下面一起来看看吧!

本文目录

  1. 得了乙肝怎么办
  2. 在WebClient请求期间发生异常C#,怎么解决

得了乙肝怎么办

目前可以用于乙肝治疗的药物有两类,一是干扰素,这是需要打针的,一是核苷酸类似物,是口服抗病毒药。但这些所谓抗病毒药也无法把乙肝病毒彻底清除掉。也就是说,现在还没有根治乙肝的办法。

所以现在对于乙肝的治疗目标只能是:通过控制乙肝病毒复制来到达减少肝炎发作,从而延缓肝硬化和肝癌发生的目的。

可以这么理解上面的治疗目标:如果一辈子没有肝炎发作的话,乙肝病毒携带者是不会变成肝硬化、肝癌的。所以,现在只需要给有肝炎发作的乙肝病人吃抗病毒药。没有肝炎发作的乙肝病毒携带者就不需要治疗了。

但是,我们不能仅仅通过肝功能是不是正常来判断乙肝病毒感染者是不是有肝炎发作。也有一些肝功能始终正常的人,其实也有肝炎发作,也是需要治疗的。因此对于年龄超过30岁的hbvDNA阳性病人,建议做肝脏穿刺病理检查,来精确判断是否有隐匿的肝炎发作,是否需要抗病毒治疗。

在WebClient请求期间发生异常C#,怎么解决

提案里把「错误」分成五类

机器抽象被破坏:建议直接terminate

代码bug:建议使用Contracts(默认terminate)

OOM:建议用new(nothrow)和try_系列函数

可恢复的错误:建议抛异常或者返回错误码

部分成功:建议当作成功

C/C++语言都是基于一台抽象机器定义的,如果这样的抽象被破坏根本没得玩,只能退出。例子是「栈」耗尽:你不可能避免、也不可能解决。

代码bug就是类似「前置条件不满足」的情况,C/C++传统上的处理办法是「需要满足某某条件,如果不满足是未定义行为」(C++一度误入OO歧途跟风搞出std::invalid_argument这种就让它随风而去吧),用户代码一般推荐assert。提案中建议统一交给Contracts处理我觉得非常好,因为这样的函数不会涉及未定义行为,同时违反时会有明确的报错信息,对懒人友好。

「部分成功」即类似「传给snprintf的缓冲长度不够用」这种,只要有良好的文档定义此时的行为,这种情况完全可以当作成功,而不是错误。

剩下的两个就是大头:「异常/错误码」和「OOM」。

静态异常是这个提案的大头。

说到底,没有异常的C++根本不是标准C++,标准库也依赖于异常。很多C++工程和规范不接受异常,主要是因为:

最终二进制体积膨胀,同时运行时需要额外的空间和时间开销

运行时空间和时间开销不确定

新的throws函数+std::error的组合是披着异常外衣的错误码,内在有点像Swift里的一种错误汇报范式:

提案中的代码类似这样

std::error可以理解为两个指针,所以可以和正常的返回值共享同一个通道(甚至寄存器):

payload:可以是错误码,也可以是异常指针exception_ptr。

domain:类似std::error_category性质,区分不同领域的错误码,可以是哈希也可以是指针

如果throws函数中有动态异常试图越界,则通过某种机制映射为对应的std::error,在payload中保存该异常的指针。

如果在普通函数中所调用的throws函数抛出异常,则通过某种机制从std::error映射为对应的动态异常对象抛出。

这样一来,静态异常和普通的返回值无异,不再依赖堆分配、RTTI,只是语法上与「传统」动态异常相似。同时还兼顾了已有代码,可以说是个非常不错的解决方案了。

Youdon'tpayforwhatyoudon'tuse.Whenyoudouseityoucan’treasonablywriteitmoreefficientlybyhand.

最后说一下OOM吧。

首先,我一直觉得「OOM不可恢复」并不成立,这一点提案中也提到了「OOM不等于内存耗尽,只是无法获得指定大小的内存,请求1T内存失败,换1G内存可能就成功了」。例如图片解码时OOM可以做subsampling。

提案中建议new失败统一terminate:

如果需要旧行为可以替换newhandler抛std::bad_alloc

如果需要自行处理可以用new(nothrow)

标准库中提供try_系列函数,例如std::vector::reserve对应std::vector::try_reserve

默认构造函数默认noexcept

我个人对此颇有微词,非常希望这一部分得不到通过:

自行替换newhandler:要求改全局的东西总有种坏味道,也让库作者、调用者很为难

new(nothrow):这种特殊化反而增加工作量,new一个对象还得同时用两种不同的错误处理机制处理问题(分别处理构造函数抛出的异常和new返回的空指针)

try_系列函数:又是「异常改错误码」的变体,如果纳入上文的throws函数范畴似乎更好

有趣的是,提案中针对是否需要特殊化OOM(是否需要区分开头的第3和第4类错误)分别列举了正反双方观点。不支持特殊化OOM的基本都是「既然一定是显式申请的,如何处理应该由调用方决定」「有某某解决方案」这种客观理由;支持特殊化OOM的理由在我看来大多很任性很讽刺:

难处理、很多人处理错了

恢复需要额外的特殊处理(无法直面事实)(按:前面括号里的内容不是我加的)

某些情况下不可能发生这样的错误

你自己标准里的解决方法就有不一致的地方

直接忽略的话会带来很多实现上的好处

最后一点才是正经的理由,如果说实现上带来方便优化等好处,特殊处理OOM似乎确实说得过去。而其它理由基本都只是在抱怨、逃避问题,非常欣赏作者的那个括号:无法直面事实。

关于在WebClient请求期间发生异常C#,怎么解决,oom异常解决办法的介绍到此结束,希望对大家有所帮助。

Ping 请求期间发生异常.

声明:本文内容来自互联网不代表本站观点,转载请注明出处:https://bk.77788889.com/11/86555.html

相关推荐