2011-01-27 3 views
23

PHP에서, 가끔 시도/캐치와 함께 몇 가지 예외를 잡을 : 코드의 종류와캐치 캐치에 아무것도하지 않고 예외가

try { 
    ... 
} catch (Exception $e) { 
    // Nothing, this is normal 
} 

를, I는 변수 $ 전자와 끝까지 (많은 자원)을 위해 생성되고 PHP_MD (PHP Mess Detector)는 사용되지 않는 변수 때문에 경고를 생성합니다.

변수를 만들지 않고 예외를 잡을 수있는 방법이 있습니까?

감사

예외의 요점이다
+1

예외가 "정상적인"것으로 처리되어서는 안됩니다. 예외는 무엇입니까? –

+0

모델이 예외를 throw하고 있다고 테스트하고 있습니다. 그래서 예외가 던져 졌는지 테스트하려고하기 때문에 빈 catch 블록이 있습니다. –

답변

6

- 당신이 처리 할 것 예외를 잡기 위해 여러 다른 catch 블록을 가질 수 있습니다. 예외 데이터는 어딘가에 할당되어야하므로 변수가 할당되어야합니다. catch 블록 내에 unset($e)과 같은 작업을 수행 할 수 있습니다. 실제로는 이러한 경고를보고 싶지 않거나 경고 (일반적으로 나쁜 생각)를 사용하지 않도록 설정할 수 있습니다.

6

어쨌든 예외를 잡아 아무것도하지 않는 것이 좋습니다. 특별한 상황을 처리하도록 예외가 존재합니다 (그렇지 않으면 실행이 중단됩니다). 따라서 언어가 그러한 유스 케이스를 용이하게하지는 않습니다.

+3

동시에 상태 코드가 필요할 때 예외를 throw하는 것은 일반적으로 좋지 않은 생각입니다. 예외가 실제로 예외적 인 경우에 우리는 쓸모없는 try/catch 블록을 보지 않을 것입니다. 특히, 많은 네트워크 유틸리티가 네트워크 문제가있을 때마다 예외를 발생 시키므로 캡슐화가 중단되고 프로그래머에게는 도움이되지 않습니다. 네트워크 문제가 네트워크 유틸리티 일 때 예외적이어서는 안됩니다. 내부적으로 처리 할 수 ​​있어야합니다. –

+0

이것은 주로 테스트 용입니다. 예외가 발생했는지 테스트하십시오 ... –

-1

예외는 예외적 인 상황에서만 사용되지 않습니다.

이 시나리오에서는 실제로 예외를 사용하여 사용자가 로그 아웃되었는지 확인합니다. 스크립트의이 시점에서 어떤 데이터를 정리해야 하는지를 파악하는 데 리소스가 매우 비쌉니다. 따라서 실제로 모든 데이터를 정리하고 예외를 잡는 것이 더 빠릅니다.

 try { 
     GDS::$DB->exec('DELETE FROM sessions WHERE session_id = ' . session_id()); 
     GDS::$DB->exec('DELETE FROM sessions WHERE user_id = ' . $this->data['user_id']); 
    } catch(PDOException $ex) {} 
    session_regenerate_id(true); 
    setcookie('bis_[user_id]', 0, time() - 1, null, null, false, true); 
    setcookie('bis_[session_start]', 0, time() - 1, null, null, false, true); 
    setcookie('bis_[session_time]', 0, time() - 1, null, null, false, true); 
+6

어떻게 대답합니까? –

+0

더하기, 첫 번째가 throw 될 경우 두 번째 명령문을 건너 뜁니다. 의도 한 것이 아닐 수도 있습니다. – Artefacto

3

아니요, 설정을 해제 할 수 있습니다.

try { 
    ... 
} catch (Exception $e) { 
    unset($e); 
} 

당신이 원하기 때문에 당신이 예외를 잡기 만한다고 가정하고 있습니다. try을 사용하려면 catch을 사용해야합니다. 그래서 사람들의 의견은 예외를 잡기위한 나쁜 생각이 무의미한 지에 대한 것입니다. try/catch을 사용하지 않고 필요한 결과를 얻으려고 노력해야합니다. 내가 아는 한 대안이 없습니다.

나는 내 템플릿 엔진에 이와 같은 것을 사용합니다.

//array of templates ordered by version new to old. 
for($templates as $tpl){ 
    try { 
     $output = render($tpl,$data); 
     //it worked 
     break; 
    } catch(ErrorException $e){ 
     unset($e); 
    } 
} 
if(!empty($output)){ 
    return $output; 
} 
관련 문제