JSON.parse에서 예외를 포착하는 올바른 방법


260

JSON.parse때로는 404 응답이 포함 된 응답을 사용 하고 있습니다. 404를 반환하는 경우 예외를 잡아서 다른 코드를 실행하는 방법이 있습니까?

data = JSON.parse(response, function (key, value) {
    var type;
    if (value && typeof value === 'object') {
        type = value.type;
        if (typeof type === 'string' && typeof window[type] === 'function') {
            return new(window[type])(value);
        }
    }
    return value;
});

3
404 응답은 자체가 XMLHttpRequest아니라에 관련되어 JSON.parse있습니다. 코드 캡펫을 보여 주시면 도와 드릴 수 있습니다.
Ming-Tang

data = JSON.parse (response, function (key, value) {var type; if (value && typeof value === 'object') {type = value.type; if (typeof type === 'string'&& typeof window [type] === 'function') {return new (window [type]) (value);}} 반환 값;
prostock

iframe에 무언가를 게시 한 다음 json 구문 분석으로 iframe의 내용을 다시 읽습니다. 때때로 json 문자열이 아닙니다.
prostock

답변:


419

iframe에 무언가를 게시 한 다음 json 구문 분석으로 iframe의 내용을 다시 읽습니다. 그래서 때로는 json 문자열이 아닙니다.

이 시도:

if(response) {
    try {
        a = JSON.parse(response);
    } catch(e) {
        alert(e); // error in the above string (in this case, yes)!
    }
}

12
try 블록에 더 많은 명령문이 포함 된 경우 eval이 없으면 e.name == "SyntaxError"로 예외를 식별 할 수 있습니다.
user1158559

1
응답이 정의되지 않으면 어떻게됩니까?
vini

12

에러 & 404 상태 코드를 확인할 수있어 try {} catch (err) {} .

당신은 이것을 시도 할 수 있습니다 :

const req = new XMLHttpRequest();
req.onreadystatechange = function() {
    if (req.status == 404) {
        console.log("404");
        return false;
    }

    if (!(req.readyState == 4 && req.status == 200))
        return false;

    const json = (function(raw) {
        try {
            return JSON.parse(raw);
        } catch (err) {
            return false;
        }
    })(req.responseText);

    if (!json)
        return false;

    document.body.innerHTML = "Your city : " + json.city + "<br>Your isp : " + json.org;
};
req.open("GET", "https://ipapi.co/json/", true);
req.send();

더 읽기 :


5

Javascript를 처음 접했습니다. 그러나 이것은 내가 이해 한 것입니다 : 유효하지 않은 JSON이 첫 번째 매개 변수 로 제공되면 예외를 JSON.parse()반환합니다 . 그래서. 다음과 같은 예외를 잡는 것이 좋습니다.SyntaxError

try {
    let sData = `
        {
            "id": "1",
            "name": "UbuntuGod",
        }
    `;
    console.log(JSON.parse(sData));
} catch (objError) {
    if (objError instanceof SyntaxError) {
        console.error(objError.name);
    } else {
        console.error(objError.message);
    }
}

"첫 번째 매개 변수"라는 단어를 굵게 표시 한 이유 JSON.parse()는 두 번째 매개 변수로 reviver 기능을 사용하기 때문입니다.


1
최종 if / else를 이해하지 못합니다. true 또는 false 인 경우 동일한 코드가 실행됩니다.console.err(objError);
HoldOffHunger

실제 오류 부분 대신 objError, name을 SyntaxError로 반환합니다.
Toshihiko

2
한가지 더. 그것은해야한다 : console.error()없습니다console.err()
k.vincent

-2

당신은 이것을 시도 할 수 있습니다 :

Promise.resolve(JSON.parse(response)).then(json => {
    response = json ;
}).catch(err => {
    response = response
});

-5

JSON.parse ()의 인수를 JSON 객체로 구문 분석 할 수없는 경우이 약속은 해결되지 않습니다.

Promise.resolve(JSON.parse('{"key":"value"}')).then(json => {
    console.log(json);
}).catch(err => {
    console.log(err);
});

2
그러나 이것은에 의해 던져진 예외를 포착하지 못합니다. JSON.parse
realappie

이것을 유효하게하려면 변경해야합니다 JSON.parse(...) 를 위해 ()=>JSON.parse(...).
John
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.