如何捕获 ColdFusion CFHTTP 超时异常?

How to catch a ColdFusion CFHTTP timeout exception?

我有一个页面,我可以在其中向外部 API 发出远程请求。我有时会在发出请求时遇到请求超时,因此,我计划在 CFHTTP 标记中设置一个低于我的默认请求超时设置的超时并捕获它。但是,我无法让我的 CFTRY/CFCATCH 捕捉到它。这是我的伪代码:

private void function makeRequest(){
        cfhttp(
            url="https://api.somesite.com/",
            method="POST",
            timeout="1",
            throwonerror="true",
            result="LOCAL.ApiHttpResult"
            ) {
        ...
        }
}

public void function tryRequest() {
    try {
        makeRequest();
    }
    catch(coldfusion.runtime.RequestTimeoutException e) {
        abort;
    }
}

我从 CFSCRIPT 得到了同样的结果:

<cffunction access="public" returntype="void" name="tryRequest">
    <cftry>
        <cfscript>
            makeRequest();
        </cfscript>
    <cfcatch type="coldfusion.runtime.RequestTimeoutException">
        <cfabort />
    </cfcatch>
</cffunction>

是否有关于 CFHTTP 超时的特殊情况导致无法以编程方式捕获?关于如何做到这一点有什么想法吗?

谢谢....

更多评论,但这太长了。无论发生什么异常,只要做一个转储。然后过滤特定的异常

public void function tryRequest() {
    try {
        makeRequest();
    }
    catch(any e) {
        writedump(e);
        // then find the details on the specific exception type
    }
}

您刚刚拼错了异常类型:它是 coldfusion.runtime.RequestTimedOutException (coldfusion.runtime.RequestTimedOutException).

但还有另一种无需异常处理的方法。只需执行常规 cfhttp,但不要指定 throwOnError 属性(或保留它 false)。在请求超时后,这仍然是 return 一个响应结构。它将填充状态代码 408 Request Time-out。您可以这样访问它:

if (left(LOCAL.ApiHttpResult.Statuscode, 3) eq "408") {
    writeOutput("HTTP request timed out");
} else {
    writeOutput("HTTP request successful with status: #LOCAL.ApiHttpResult.Statuscode#");
}