2012-08-11 2 views
0

PHP의 오류 억제 기인 것 같습니다. @은 화면에 오류를 표시하지 않지만 여전히 내 사용자 정의 오류 처리기를 트리거하고 있습니다.@가 사용자 정의 오류 처리기를 트리거하지 않도록하십시오.

예 :

@json_decode(array());

이것은하지만 여전히 예를 들어 내 오류 처리기를 (실행 오류 로그 나 이메일을 화면에 출력 오류 메시지를 보낼 수있을 것처럼, 스크립트 실행을 종료하지 않습니다 "실제"오류).

@이 완전히 침묵 할 수있는 방법이 있습니까?

+2

처음에는 @를 사용하기 위해 -1을 사용할 자격이 있습니다 – w00

+0

@ w00 다른 방법이 없으므로 -1이 필요합니다. http://stackoverflow.com/questions/2348152/detect-bad-json- data-in-php-json-decode +1 나를 위해 :-) – IMB

+0

wtf 당신은 얘기하고 있습니다. 그 주제에서 OP는 분명히 그가 문자열 대신에'json_decode' 함수에'array'를 전달하는 문제를 가지고 있습니다. 그것은 오류가 발생하지 않는 것이 놀랄 일이 아닙니다. $ 변수가 실제로 string 유형인지 확인하십시오. -2 당신을 위해서 :-) – w00

답변

2

나는 오류 처리기가 @에 의해 표시되지 않는 오류를 보지 못하도록 할 수 있다고 생각하지 않습니다.

그러나 이러한 오류를 격리하고 무시할 수 있습니다.

는 오류 처리기에 다음 코드를 넣어 : $errno 오류 핸들러 콜백에 대한 첫 번째 인수입니다

// get the current error reporting level 
$level = error_reporting(); 

// if error was supressed or $errno not set in current error level 
if ($level == 0 || ($level & $errno) == 0) { 
    return true; 
} 

하는 것으로.

+0

$ level == 0은 필요하지 않습니다. 당신은 if 문을 다음과 같이 작성할 수 있습니다 : if ($ level & $ errno) – bobwienholt

3

올바른 json을 찾으려면 json_decode에 전달되는 "param"이 string 유형인지 확인하십시오. php.net에서

견적 :

적절한 PHP 타입 JSON 인코딩 된 값을 반환. 값 참, 거짓 및 널 (대소 문자를 구분하지 않음)은 TRUE로, 거짓은 및 NULL로 각각 반환됩니다. json을 으로 디코딩 할 수 없거나 인코딩 된 데이터가 재귀 제한보다 클 경우 NULL이 반환됩니다.

따라서 JSON을 디코딩 할 수없는 경우 우리가 찾고있는 것은 NULL입니다. 따라서 잘못된 JSON입니다. 그러나 다시 한번, 배열이나 부울 또는 다른 것과 같은 문자열이 아닌 다른 형식을 전달하는지 확인하십시오. 그것은 결코 작동하지 않을 것이기 때문입니다.

그리고 귀하의 문제를 이해합니다. @ 기호는 오류 메시지를 억제하지만 실제 코드 흐름은 표시하지 않습니다. 그것은 잘못되었을 때도 나간다. 하지만 당신은 정말로 @ 기호를 놓아 줘야합니다.

그래서 어쨌든, 당신은 아마도 json_decode을 포함한 몇 가지 일을하는 일종의 함수를 가지고있을 것입니다. 이것은 단지 예일뿐입니다. 그러나 그것은 제가 여러분이 의미하는 바를 알려줄 것입니다.

<?php 

// will fail, because it's not a string 
$str1 = array ("nooblol"); 

// Will succeed. This is valid json 
$str2 = '{"example":"value"}'; 

// Will fail, is of type string, but still an invalid json format 
$str3 = 'invalid json string'; 

function saveData ($json) 
{ 
    // Check if the variable that we're about to pass 
    // to json_decode() is an actual string. Otherwise we 
    // have invalid json data anyway. 
    if (!is_string ($json)) 
    { 
     echo 'Invalid json (or invalid type)'; 
     return; 
    } 

    if (!$obj = json_decode ($json)) 
    { 
     echo 'fail'; 
     return; 
    } 

    // Print json object 
    print_r($obj); 
} 

saveData ($str3); 

?> 

라이브 예 : http://codepad.viper-7.com/KJL8st 변경 다른 결과를 볼 수 $str1 또는 $str2saveData PARAM.

유효한 json이 있는지 확인하는 방법입니다. 전적으로 유효한 데이터인지 여부를 알려주는 json_decode() 함수에 의존하지 마십시오. 함수이고 단순히 문자열을 기대합니다. 문자열을 전달해야합니다. 그래야만 유효한 json인지 여부를 알려줄 수 있습니다.

+0

이것들은 유효한 json이지만 예제'$ str = ''; 또는'$ str = null; '에서 실패합니다. – IMB

+0

@IMB - 예제는 유효한 JSON이 아닙니다. JSON 텍스트의 가장 바깥 쪽 레이어는 배열 또는 객체 여야합니다. [The specification] (JSON 문법)의 2 단락 (http://www.ietf.org/rfc/rfc4627.txt)을 참조하십시오. – Quentin

+0

@Quentin clear0 'json_encode ($ str)'은 유효한 JSON으로 만듭니다. 위의 스크립트에서 실행하면 실패합니다. – IMB

관련 문제