2016-06-10 2 views
-1

함수 인수 형식이 설정되고 잘못된 형식의 인수가이 함수로 전달되면 오류가 트리거됩니다. 문제는이 오류가 @ 연산자로 표시되지 않는다는 것입니다. 정확한 오류 메시지가 표시되지 않지만 어쨌든 실행이 중지됩니다.잘못된 함수 인수 오류를 억제하는 방법?

function callback(DateTime $arg) { 
    return 'Success'; 
} 

function doAction(callable $callback) {  
    $value = 'Empty'; 
    $value = @$callback(123); 
    var_dump($value); // Expect `Empty` or NULL here 
} 

doAction('callback'); 

이 오류는 try-catch에서 발견 할 수 있습니다.

PHP 5.x.x에서 실행을 중단하지 않으려면 어떻게해야합니까?

+0

언제든지 오류를 해결할 수 있습니다 ... –

+0

@JonStirling, 예제는 가능한 간단합니다. 'test' 함수는 예를 들어 콜백 인 경우와 같이 다를 수 있습니다. – Finesse

+0

내 의견이 바뀌지 않는다고 생각합니다. –

답변

-1

전달 된 함수가 DateTime 클래스의 인스턴스인지 여부를 확인하고 이에 따라 오류를 throw합니다. 예외로이 오류가집니다

function test(DateTime $arg) { 
    if ($arg isinstanceof DateTime) { 
     return 'Success'; 
    } else { 
     return false; 
    } 
} 
+0

인수 선언을 사용하면'instanceof'가 실행되기 전에 오류가 트리거됩니다. – Finesse

+0

타입 연산자는 isinstanceof가 아닌'instanceof'입니다. –

0

설정 사용자 지정 오류 처리기 :

function callback(DateTime $arg) { 
    return 'Success'; 
} 

function doAction(callable $callback) {  
    $value = 'Empty'; 

    set_error_handler(function($errno, $errstr, $errfile, $errline) { 
     if ($errno === E_RECOVERABLE_ERROR) 
      throw new ErrorException($errstr, $errno, 0, $errfile, $errline); 

     return false; 
    }); 

    try { 
     $value = @$callback(123); 
    } catch (Exception $e) { // For PHP 5 
    } catch (Error $e) {  // For PHP 7 
    } 

    restore_error_handler(); 

    var_dump($value); // Expect `Empty` or NULL here 
} 

doAction('callback'); 
0

당신은 두 가지 옵션이 있습니다.

  1. 유형 힌트를 제거하고 인수 유형을 callback에서 확인한 후 조작하십시오. (나는이 것을 선호한다.)
  2. 값을 인자로 넘기 전에 확인하고 콜백을 실행하지 않는다.

참고 : 오류 제어 연산자를 사용하여이 나쁜 방법입니다.

관련 문제