programing tip

PHP : 예외를 포착하고 실행을 계속할 수 있습니까?

itbloger 2020. 11. 19. 07:55
반응형

PHP : 예외를 포착하고 실행을 계속할 수 있습니까?


예외를 포착하고 스크립트 실행을 계속할 수 있습니까?


물론, 계속 실행하려는 예외를 잡아라 ...

  try
  {
      SomeOperation();
  }
  catch (SomeException $e)
  {
      // do nothing... php will ignore and continue    
  }

물론 이것은 매우 중요한 오류가 될 수있는 것을 조용히 삭제하는 문제가 있습니다. SomeOperation ()이 실패하여 다른 미묘하고 파악하기 어려운 문제를 일으킬 수 있지만 예외를 자동으로 삭제하는지 여부는 알 수 없습니다.


예,하지만 실행하려는 항목에 따라 다릅니다.

try {
   a();
   b();
}
catch(Exception $e){
}

c();

c()항상 실행됩니다. 그러나 a()예외 b()발생하면 실행 되지 않습니다 .

try서로 의존 하는 블록 에만 물건을 넣으십시오 . 예를 들어 b어떤 결과에 따라 블록 뒤에 a두는 b것은 의미가 없습니다 try-catch.


확실한:

try {
   throw new Exception('Something bad');
} catch (Exception $e) {
    // Do nothing
}

Exceptions 에 대한 PHP 문서를 읽어보고 싶을 수도 있습니다 .


예.

try {
    Somecode();
catch (Exception $e) {
    // handle or ignore exception here. 
}

그러나 php에는 예외와는 별개의 오류 코드가 있습니다. php가 oop 프리미티브를 갖기 전의 레거시 홀드 오버입니다. 대부분의 라이브러리 내장은 여전히 ​​예외가 아닌 오류 코드를 발생시킵니다. 오류 코드를 무시하려면 @ 접두사가 붙은 함수를 호출하십시오.

@myfunction();

PHP> 7

새로운 인터페이스 Throwable 사용

    try {
        // Code that may throw an Exception or Error.
    } catch (Throwable $t) {
        // Handle exception
    }

echo "Script is still running..."; // this script will be executed.

이에 대한 또 다른 각도는 처리 코드에서 예외를 던지지 않고 예외를 반환하는 것입니다.

내가 작성중인 템플릿 프레임 워크로이 작업을 수행해야했습니다. 사용자가 데이터에 존재하지 않는 속성에 액세스하려고 하면 처리 함수 내에서 오류를 던지는 대신 오류를 반환 합니다.

그런 다음 호출 코드에서이 반환 된 오류를 발생시켜 try ()를 catch ()로 만들지 아니면 계속할지 결정할 수 있습니다.

// process the template
    try
    {
        // this function will pass back a value, or a TemplateExecption if invalid
            $result = $this->process($value);

        // if the result is an error, choose what to do with it
            if($result instanceof TemplateExecption)
            {
                if(DEBUGGING == TRUE)
                {
                    throw($result); // throw the original error
                }
                else
                {
                    $result = NULL; // ignore the error
                }
            }
    }

// catch TemplateExceptions
    catch(TemplateException $e)
    {
        // handle template exceptions
    }

// catch normal PHP Exceptions
    catch(Exception $e)
    {
        // handle normal exceptions
    }

// if we get here, $result was valid, or ignored
    return $result;

그 결과 원래 오류가 맨 위에 던져졌음에도 불구하고 여전히 원래 오류의 컨텍스트를 얻습니다.

또 다른 옵션은 사용자 지정 NullObject 또는 UnknownProperty 개체를 반환하고 catch ()를 트립하기 전에 비교하는 것입니다. 그러나 어쨌든 오류를 다시 던질 수 있으므로 전체 구조를 완전히 제어 할 수있는 경우 이것은 시도 / 잡기를 계속할 수 없다는 문제에 대한 깔끔한 방법이라고 생각하십시오.


An old question, but one I had in the past when coming away from VBA scipts to php, where you could us "GoTo" to re-enter a loop "On Error" with a "Resume" and away it went still processing the function.
In php, after a bit of trial and error, I now use nested try{} catch{} for critical versus non critical processes, or even for interdependent class calls so I can trace my way back to the start of the error. e.g. if function b is dependant on function a, but function c is a nice to have but should not stop the process, and I still want to know the outcomes of all 3 regardless, here's what I do:

//set up array to capture output of all 3 functions
$resultArr = array(array(), array(), array());

// Loop through the primary array and run the functions 
foreach($x as $key => $val)
{
    try
    {
        $resultArr[$key][0][] = a($key); 
        $resultArr[$key][1][] = b($val);
        try
        { // If successful, output of c() is captured
            $resultArr[$key][2][] = c($key, $val);
        }
        catch(Exception $ex)
        { // If an error, capture why c() failed
            $resultArr[$key][2][] = $ex->getMessage();
        }
    }
    catch(Exception $ex)
    { // If critical functions a() or b() fail, we catch the reason why
        $criticalError = $ex->getMessage();
    }
} 

Now I can loop through my result array for each key and assess the outcomes. If there is a critical failure for a() or b().
I still have a point of reference on how far it got before a critical failure occurred within the $resultArr and if the exception handler is set correctly, I know if it was a() or b() that failed.
If c() fails, loop keeps going. If c() failed at various points, with a bit of extra post loop logic I can even find out if c() worked or had an error on each iteration by interrogating $resultArr[$key][2].

참고URL : https://stackoverflow.com/questions/2132759/php-catch-exception-and-continue-execution-is-it-possible

반응형