Ошибка перехвата в ответе $ .ajax и отображение исключения - PullRequest
0 голосов
/ 11 октября 2018

У меня есть следующий код, который вызывает API и кэширует результат (поэтому он будет использоваться несколько раз):

var requestCache = {};
function LoadDataFromApi(apiUrl) {
    if (!requestCache[apiUrl]) {
        requestCache[apiUrl] = $.ajax({
            type: 'GET',
            url: apiUrl,
            dataType: "json"
        });
    }
    return requestCache[apiUrl];
}

В некоторых случаях API выдает исключение, которое я пытаюсьпоймать и показать.Согласно отладчику Firefox, когда возникает исключение, данные ответа выглядят так:

{
   "Message":"An error has occurred.",
   "ExceptionMessage":"Invalid object name 'Foo_Bar'.",
   "ExceptionType":"System.Data.SqlClient.SqlException",
}

Из документации JQuery я вижу, что в $.ajax есть объект statusCode, но я не могу успешно реализовать это. ответ здесь близок, но на самом деле не извлекает сообщение об исключении.

Из различных поисков сегодня я получил это далеко, но JSON не анализирует, и яне знаю, в чем проблема, потому что JSON анализирует нормально, когда используется где-то еще:

function LoadDataFromApi(apiUrl) {
    if (!requestCache[apiUrl]) {
        requestCache[apiUrl] = $.ajax({
            type: 'GET',
            url: apiUrl,
            dataType: "json",
            statusCode: {
                500: function (json) {
                    var j = JSON.parse(json);
                    alert(j.Message);
                }
            }
        });
    }
    return requestCache[apiUrl];
}

Буду признателен, если кто-нибудь обнаружит проблему в моем коде, пожалуйста?

Ответы [ 2 ]

0 голосов
/ 12 октября 2018

Я наконец понял, после долгих поисков, благодаря этому ответу .

Проблема была здесь:

500: function (json) {

Оказывается, что хотяAPI возвращает данные JSON, JQuery заключает их в объект jqXHR , который имеет ряд свойств.

Ожидаемые данные JSON содержатся в свойстве responseText объекта jqXHR, так что сначала нужно разобрать.Таким образом, полное решение:

function LoadDataFromApi(apiUrl) {
    if (!requestCache[apiUrl]) {
        var result = $.ajax({
            type: 'GET',
            url: apiUrl,
            dataType: "json",
            statusCode: {
                // JQuery now has an jqXHR containing all the data we need regarding any success/failures (as we can address multiple status codes here)
                500: function (xhr) {
                    // Parse the JSON data we expected
                    var err = JSON.parse(xhr.responseText);
                    // Display the error data
                    console.log('Message:' + err.Message);
                    console.log('ExceptionMessage:' + err.ExceptionMessage);
                    console.log('ExceptionType:' + err.ExceptionType);
                },
                200: function (xhr) {
                    // console.log('success');
                    // var goodData = JSON.parse(xhr.responseText);
                }
            }
        });
        // This line would generally go in success, but I need to re-use the data regardless of the status code
        requestCache[apiUrl] = result;
    }
    return requestCache[apiUrl];
}
0 голосов
/ 11 октября 2018

Можем ли мы перейти на

public class theException
{
    public string Message { get; set; }
    public string ExceptionMessage { get; set; }
    public string ExceptionType { get; set; }
}

public class EvilDrController : ApiController
{
    public theException GetContrivedException()
    {
        var exception = new theException
        {
            ExceptionMessage = "Invalid object name 'Foo_Bar'.",
            ExceptionType = "System.Data.SqlClient.SqlException",
            Message = "An error has occured"
        };
        return exception;
    }
}

html файл или cshtml

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title>EvilDr</title>
</head>
<body>

    <div>
        <h2>Parse JSON</h2>
    </div>
    <script src="http://ajax.aspnetcdn.com/ajax/jQuery/jquery-2.0.3.min.js"></script>
    <script>
        //or whatever uri you want
        var uri = 'api/evildr';

        $(document).ready(function () {
            // Send an AJAX request
            $.getJSON(uri)
                .done(function (data) {
                    var j = JSON.stringify(data)
                    alert(j)
                });
        });
    </script>
</body>
</html>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...