2017-01-10 2 views
1

발전기에서 예외를 catch하여 다음 값을 얻을 수 있습니까? 아래 예제에서 코드와 비슷한 것을 시도했지만 예외적으로 멈추고 다음 값을 "expected"로 반환하지 않습니다. 이 사람이 얼마나 PHP에서 예외를 잡아에 가야 을 알고 싶었 기 때문에PHP 생성기 : 예외 및 수익률 잡기

function generator(){ 
    foreach($aLotOfWork as $task){ 
     try { 
     $promise = doSomethingThatCanFailBadly($task); 

     yield $promise; 
     } catch (Exception $e) { 
     echo "oh.. there is an error, but I don't care and continue"; 
     } 
    } 
    } 

이럴 이것은, (php: catch exception and continue execution, is it possible?)의 중복이 아니다. 내 경우에는 이 이미이지만 모든 예외를 포착 할 수 있지만 발전기가 정지하고 의도 한대로 진행하지 않습니다.

+0

[php : 예외를 잡아서 실행을 계속할 수 있습니까?] (http://stackoverflow.com/questions/2132759/php-catch-exception-and-continue-execution-is-it-possible)) –

+1

그냥'continue;'문장을 추가하면 괜찮을 것입니다. – Paradoxis

+0

@RobertoGeuke 안녕하세요, 저는 다른 게시물을 발견했는데, 이것들은 두 가지 명백한 경우입니다. 이미 try/catch를 사용하지만 다른 동작을 기대합니다. 다른 사람은 try/catch 구조를 찾고있었습니다. – NaN

답변

0

생성자의 출력을 배열에 저장해야하며, 개별 출력 중에 예외가 발생하고 올바른 예외 처리가 필요한 경우 배열에 들어 가지 않습니다.

예에서 doSomethingThatCanFailBadly이 예외를 throw하면 프로그램 흐름이 catch 분기로 표시됩니다. 따라서 실제로 doSomethingThatCanFailBadly에는 $promise에 할당 할 수있는 반환 값이 없으므로 그 시점에서 아무 것도 산출 할 수 없습니다.

+0

또한 generator 함수 대신 배열을 사용하는 편이 좋겠지 만, programm가 이미 작동하는 동안 새로운 "tasks"를 추가하고 싶기 때문에 generator를 사용해야합니다. 참조로 전달하는 것이 가능할 수도 있지만 더 쉽고 더러운 해킹과 같은 것은 아닙니다. – NaN

+1

나는 그것이 가능하다해도 참조를 망칠 필요가 없다고 생각합니다. 코드 자살이야 :) –

1

코드는 바로이며 예외를 포착하고 계속이 체크 아웃됩니다

$ cat so.php 
<?php 

function doSomethingThatCanFailBadly($task) { 
    if ($task == 3) { 
    throw new Exception(); 
    } 
    return $task; 
} 

function generator(){ 
    $aLotOfWork = array(1,2,3,4,5); 
    foreach($aLotOfWork as $task){ 
     try { 
     $promise = doSomethingThatCanFailBadly($task); 

     yield $promise; 
     } catch (Exception $e) { 
     echo "oh.. there is an error, but I don't care and continue\n"; 
     } 
    } 
    } 


foreach (generator() as $number) { 
    echo "$number\n"; 
} 
?> 

$ php so.php 
1 
2 
oh.. there is an error, but I don't care and continue 
4 
5 

이 당신의 오류 스택 추적에서보세요. 어쩌면 당신의 doSomethingThatCanFailBadly 메서드 내부에있는 뭔가가 예외를 생성하고 있지만 catch 블록에 도달하기 전에이를 catch하고 die() 또는 exit()으로 강제 종료 할 수 있습니다. 이 경우에는 할 수있는 일이별로 없습니다. 당신은 아마도 register_shutdown_function을 사용할 수 있으며 그것이 도움이되는지 보아라. 그러나 그것은 너무 엉망인 것처럼 보인다.

0

@palako는 문제를 아주 잘 설명했지만, 제 사건에 대한 해결책을 제시하지 못했습니다. 이 생성기를 사용하여 약속을 생성하고 소비자 (Guzzle의 EachPromise- 메서드)가 예외 작업을 중단 한 것으로 보입니다. 그래서 throw new SomeException('error message') 문을 return RejectedPromise('error message')으로 바꿨습니다.

나는이 상황이 매우 특정한 해결책이라는 것을 인정해야하지만 다른 설정에서도 비슷한 것을 할 수 있습니다 : 예외를 사용하는 대신 객체를 반환하십시오.