Win32 getaddrinfo()在ISO C代码中触发cdb异常的疑问咨询
关于getaddrinfo()触发00000005首次机会异常的问题解答
1. 该异常是否属于正常情况?
首次机会异常≠程序错误,Windows系统中不少系统API会利用异常机制处理内部逻辑,getaddrinfo()也属于这类情况。尤其是在1024线程的高并发场景下,API内部可能因资源竞争、临时内存访问触发这类首次机会异常,只要后续能被API自身的异常处理逻辑捕获并恢复,就属于正常的内部行为,不会影响业务代码的执行。
2. 如何捕获此异常?或是该异常在getaddrinfo()返回至业务代码前已被处理?
这个异常会被getaddrinfo()内部的异常处理逻辑捕获,不会传递到业务代码层面。如果非要手动捕获,可在调用getaddrinfo()的线程中用结构化异常处理(SEH)包裹调用:
__try { int ret = getaddrinfo(...); // 处理返回值 } __except(GetExceptionCode() == 0x00000005 ? EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) { // 捕获访问违规异常后的处理逻辑 }
但通常没必要这么做,API已自行完成异常处理。
关于getaddrinfo()返回逻辑的确认
getaddrinfo()会正常返回错误码,不会因这个内部首次机会异常跳过返回直接终止线程。只要API内部完成异常恢复,就会按正常逻辑返回对应错误码(如EAI_AGAIN、EAI_FAIL等),业务代码可通过返回值判断执行结果,无需担心线程被异常终止。
内容的提问来源于stack exchange,提问作者Roland Mainz
相关产品推荐
相关产品推荐

