Как проверить ошибку собственного кода в блоке cfcatch? - PullRequest
0 голосов
/ 31 августа 2018

У меня есть блок cfcatch, который должен перехватывать любые исключения. После обнаружения ошибки я создаю пользовательскую функцию, которая принимает NativeErrorCode в качестве аргумента. Если код ошибки, который я ищу, указывает на нарушение дубликатов или PK, у меня есть пользовательское сообщение, которое будет возвращено пользователю. Если код ошибки не тот, который я ищу, то будет возвращено глобальное сообщение. Однако я столкнулся с проблемой, когда ColdFusion вернул сообщение об ошибке, что NativeErrorCode не существует. Я знаю, что собственный код ошибки зарезервирован для типа базы данных. Есть ли способ проверить тип и предотвратить эту проблему, или есть лучший способ исправить эту проблему? Вот мой пример кода:

<cftry>
    // Stored procedure call
    <cfcatch type="any">
        <cfset local.fnResults = {status : "400", message : Application.functions.errorCatch(cfcatch.NativeErrorCode)}>
    </cfcatch>
</cftry>

public string function errorCatch(required string ErrorCode) {
    local.message = "";

    if(arguments.ErrorCode EQ 2627){
        local.message = "Error! Cannot insert duplicate value.";
    }else{
        local.message = "Error! Please contact your administrator.";
    }

    return message;
}

Вы можете увидеть выше, как работает моя функция errorCatch и какой код я проверяю. Я все еще хочу, чтобы cfcatch захватывал все исключения в моем коде, а не только ошибки базы данных.

1 Ответ

0 голосов
/ 31 августа 2018

На ум приходят два способа обработки логики перехвата ветвления, иметь 2 блока перехвата или проверить, что объект перехвата содержит нужные данные.

В моем первом примере я добавил блок catch исключительно для ошибок базы данных. Если тип ошибки - база данных, будет включен собственный код ошибки или он будет равен -1, если драйвер базы данных его не содержит. Для аргумента any я просто добавил строку возврата по умолчанию. Возможно, вы захотите иметь собственную логику, которая обрабатывает исключения, не относящиеся к типу базы данных.

<cftry>
    // Stored procedure call
    <cfcatch type="database">
       <cfset local.fnResults = {status : "400", message : Application.functions.errorCatch(cfcatch.NativeErrorCode)}>
    </cfcatch>

    <cfcatch type="any">
        //Non database related error
        <cfset local.fnResults = "Error! Please contact your administrator.">
    </cfcatch>
</cftry>

Во втором моем примере я только что обновил вашу функцию errorCatch, проверив, что NativeErrorCode существует, прежде чем мы попытаемся передать его.

    <cfcatch type="any">
        //Passing the default error code value, you may want custom logic here
        <cfset local.fnResults = {
            status : "400", 
            message : Application.functions.errorCatch( cfcatch.keyExists("NativeErrorCode")?cfcatch.NativeErrorCode:-1)
        }>
    </cfcatch>
...