PHP : '또는'명령에 대한 명세서 실패 : 새로운 예외를 던지는 방법?
-
06-07-2019 - |
문제
여기있는 모든 사람은 '또는'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 이상에서 예약 키워드를 메소드 이름으로 사용할 수 있습니다.