>  기사  >  백엔드 개발  >  `json.Marshal`은 언제 패닉이 아닌 오류를 반환합니까?

`json.Marshal`은 언제 패닉이 아닌 오류를 반환합니까?

Barbara Streisand
Barbara Streisand원래의
2024-11-01 06:34:31188검색

When Does `json.Marshal` Return a Non-Panic Error?

json.Marshal 오류 처리: 입력으로 인한 오류 이해

문서에 강조 표시된 대로 json.Marshal 함수는 주기적 처리에 실패합니다. 데이터 구조로 인해 런타임 패닉이 발생합니다. 이는 일반적인 시나리오이지만 대신 패닉이 아닌 오류가 생성되는 상황이 발생할 수 있습니다.

오류 생성을 유발하는 입력

비 패닉 오류를 설명하려면 패닉 시나리오에서는 다음 예를 고려하십시오.

<code class="go">type Node struct {
    Value int
    Next  *Node
}

func main() {
    node1 := Node{1, nil}
    node2 := Node{2, &node1}
    node1.Next = &node2

    _, err := json.Marshal(node1)
    if err != nil {
        fmt.Printf("Error encountered: %v\n", err)
    }
}</code>

결과:

위 프로그램은 패닉 없이 실행되고 대신 오류를 반환합니다. json: 지원되지 않는 유형: * main.Node

오류 유형

json.Marshal 함수는 두 가지 유형의 오류를 생성할 수 있습니다.

  • UnsupportedTypeError: 채널이나 함수 등 잘못된 유형이 전달될 때 발생합니다.
  • UnsupportedValueError: 무한대 등 잘못된 값이 제공될 때 발생합니다.

주어진 예에서 오류는 잘못된 유형이 아닌 잘못된 값(순환 데이터 구조)과 관련되어 있으므로 UnsupportedValueError 범주에 속합니다.

추가 예:

다음은 json.Marshal이 nil이 아닌 오류를 반환하게 할 수 있는 몇 가지 추가 시나리오입니다.

<code class="go">_, err := json.Marshal(nil)  // Error: json: unsupported value: nil
_, err := json.Marshal(1e100) // Error: json: unsupported value: 1e+100, must be finite</code>

위 내용은 `json.Marshal`은 언제 패닉이 아닌 오류를 반환합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.