문제

여기있는 모든 사람은 '또는'Statemens를 알아야합니다. 일반적으로 다이 () 명령에 붙어 있습니다.

$foo = bar() or die('Error: bar function return false.');

우리가 다음과 같은 것을 볼 때 가장 많은 시간.

mysql_query('SELECT ...') or die('Error in during the query');

그러나 나는 그 '또는'진술이 정확히 어떻게 작동하는지 이해할 수 없습니다.

다이 () 대신 새로운 예외를 던지고 싶지만 :

try{
    $foo = bar() or throw new Exception('We have a problem here');

작동하지 않고 둘 다

$foo = bar() or function(){ throw new Exception('We have a problem here'); }

내가 그것을 발견 한 유일한 방법은이 끔찍한 생각입니다.

function ThrowMe($mess, $code){
    throw new Exception($mess, $code);
}
try{
    $foo = bar() or ThrowMe('We have a problem in here', 666);
}catch(Exception $e){
    echo $e->getMessage();
}

그러나 '또는'진술 직후에 새로운 예외를 던질 수있는 방법이 있습니까?

또는 이런 종류의 구조는 필수입니다 (나는 Throwme 기능을 전혀 거짓말하지 않습니다) :

try{
    $foo = bar();
    if(!$foo){
        throw new Exception('We have a problem in here');
    }
}catch(Exception $e){
    echo $e->getMessage();
}

편집하다: 내가 원하는 것은 실제로 if ()의 사용을 피하는 것입니다.

#The echo $e->getMessage(); is just an example, in real life this have no sense!
try{
    $foo = bar();
    if(!$foo){
        throw new Exception('Problems with bar()');
    }
    $aa = bb($foo);
    if(!$aa){
        throw new Exception('Problems with bb()');
    }
    //...and so on!
}catch(Exception $e){
    echo $e->getMessage();
}

#But i relly prefer to use something like:

try{
    $foo = bar() or throw new Exception('Problems with bar()');
    $aa = bb($foo) or throw new Exception('Problems with bb()');
    //...and so on!
}catch(Exception $e){
    echo $e->getMessage();
}

#Actually, the only way i figured out is:

try{
    $foo = bar() or throw new ThrowMe('Problems with bar()', 1);
    $aa = bb($foo) or throw new ThrowMe('Problems with bb()', 2);
    //...and so on!
}catch(Exception $e){
    echo $e->getMessage();
}

#But i'll love to thro the exception directly instead of trick it with ThrowMe function.
도움이 되었습니까?

해결책

or 그냥 a 논리 연산자, 그리고 그것은 유사합니다 ||.

일반적인 속임수

mysql_query() or die();

마찬가지로 글을 쓸 수 있습니다

mysql_query() || die();

여기서 일어나는 일은 "논리적 또는"연산자 (선택한 사람이 선택하든)이 어느 피연산자가 TRUE로 평가하는지 판단하려고합니다. 이는 피연산자가 부울로 캐스트 될 수있는 표현이어야한다는 것을 의미합니다.

그래서 이유

bar() or throw new Exception();

불법입니다

(boolean)throw new Exception();

또한 불법입니다. 본질적으로 예외를 던지는 프로세스는 연산자가 확인할 반환 값을 생성하지 않습니다.

그러나 함수를 호출합니다 하다 연산자가 확인할 반환 값을 생성합니다 (명시 적 반환 값 없음 값은 int 기능이 반환됩니다. NULL 어느 쪽이 캐스팅됩니다 FALSE) 함수를 던지는 예외를 랩핑 할 때 작동하는 이유입니다.

도움이되기를 바랍니다.

다른 팁

그렇지 그래 bar() 그리고 bb() 예외를 던져? PHP 예외에서 버블 업이므로 호출하는 기능/방법에서 예외를 던질 필요가 없습니다. bar()/bb(). 이러한 예외는 발생할 수 있습니다 bar()/bb(). 또 다른 예외를 던지고 싶다면 간단히 할 수 있습니다.

function foo() {
    try {
        $bar = bar();
    } catch (BarException) {
        throw new FooException;
    }
}

"또는 die ()"를 대체 할 수있는 해결책은 어디에서나 콜 _user_func에 의해 즉시 호출되는 익명 함수로 던지기를 감싸는 것입니다.

call_user_func(function(){
    throw new Exception("ERROR");
});

더미 스크립트에서 이것을 실행하여 작동한다는 것을 알 수 있습니다.

false or call_user_func(function(){throw new Exception("ERROR");});

나는 당신이 마지막 구조와 같은 것을 사용하고 싶다고 생각하지만, 그에 대한 예외를 사용하는 데는 아무런 의미가 없습니다.

$foo = bar();
if(!$foo){
    echo 'We have a problem in here';
}

의견 당 - 나는 당신이 한 줄로 할 수 있다고 생각하지 않습니다 (예 : if(!$foo) 점검), 그리고 예외 던지기 방법이 끔찍하다는 데 동의합니다. 개인적으로, 나는 다음의 명시성을 선호합니다.

$foo = bar();
if(!$foo){
    throw new Exception('We have a problem in here');
}

그러나 그것은 개인적인 취향입니다. 단일 라인을 원한다면 예외적 인 기능 옵션을 사용해야한다고 생각합니다.

이 제한은 아마도 PHP의 동적 인 유형의 것들에 낮은 것 같아요. 기능 호출 결과를 조건부에 시전 할 수는 있지만 throw.

추가 기능이없는 단일 라인 솔루션은 다음과 같습니다.

if (!($foo = bar())) throw new Exception('We have a problem here');

나는 단순히 함수를 정의했다 toss 이것을 위해.

function toss(Exception $exception): void
{
    throw $exception;
}

예외가있을 때 파일/줄/스택 정보가 캡처되기 때문에 구성된 (new) 던지지 않음 (throw) 이것은 통화 스택을 방해하지 않습니다.

그래서 당신은 이것을 할 수 있습니다.

something() or toss(new Exception('something failed'));

사용자 정의 예외 클래스를 생성하고 대신 정적 생성자 메소드를 사용할 수 있습니다. throw new Exception() 건설.

예외 클래스 :

class CustomException extends Exception {
  static public function doThrow($message = "", $code = 0, Exception $previous = null) {
    throw new Exception($message, $code, $previous);
  }
}

용법:

try {

  $foo = bar() or CustomException::doThrow('Problems with bar()');
  $aa = bb($foo) or CustomException::doThrow('Problems with bb()');

} catch(Exception $e){
  echo $e->getMessage();
}

메모

PHP 7 이상을 사용하는 경우 정적 메소드 이름을 바꿀 수 있습니다. doThrow() 간단히 throw(), PHP 7 이상에서 예약 키워드를 메소드 이름으로 사용할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top