Как перехватить исключение тайм-аута ColdFusion CFHTTP?

У меня есть страница, на которой я делаю удаленный запрос к внешнему API. Я иногда получаю тайм-ауты запроса при выполнении запроса, поэтому я планирую установить тайм-аут в теге CFHTTP, который ниже, чем мой параметр requesttimeout по умолчанию, и поймать его. Однако я не могу заставить свой 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, что делает его невозможным для программного отлова? Есть идеи, как это сделать?

Спасибо....


person Eric Belair    schedule 25.06.2020    source источник


Ответы (2)


Вы просто неправильно написали тип исключения: это coldfusion.runtime.RequestTimedOutException (coldfusion.runtime.RequestTimedOutException).

Но есть и другой способ сделать это без обработки исключений. Просто сделайте обычный cfhttp, но не указывайте атрибут throwOnError (или оставьте его false). Это по-прежнему будет возвращать структуру ответа после истечения времени ожидания запроса. Он будет заполнен кодом состояния 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#");
}
person Alex    schedule 25.06.2020
comment
О, круто. Я собираюсь попробовать это сегодня! Надеюсь, что смогу принять ваш ответ. - person Eric Belair; 26.06.2020

Еще комментарий, но это слишком долго. Просто сделайте дамп любого исключения. Затем отфильтруйте конкретное исключение

public void function tryRequest() {
    try {
        makeRequest();
    }
    catch(any e) {
        writedump(e);
        // then find the details on the specific exception type
    }
}
person James A Mohler    schedule 25.06.2020
comment
Я понял, что могу это сделать, но поиск строки кажется неуклюжим. Хотя это может быть мой единственный вариант. - person Eric Belair; 26.06.2020