2012-01-09 2 views
3

모든 캐치되지 않는 예외를 잡기 없습니다. 데이터를 저장하기 위해 데이터베이스를 사용하는 Session 구성 요소는 ExceptionHandler 직후에 생성됩니다.ExceptionHandler 내가 간단한 ExceptionHandler 클래스를 구축

세션 구성 요소는 APC를 사용하는 경우 제대로 세션을 종료하려면 다음을 설정합니다

register_shutdown_function('session_write_close'); 

내가 다음 내 MySQL 서버를 종료하고 응용 프로그램을 실행하여 테스트를 수행 하였다. 어떤 수수께끼 것은 예외가 ExceptionHandler에 의해 체포되어 있다는 것입니다, 그러나 동시에이 포착되지 않은 남아 Xdebug는에 의해 출력이 원인이 될 수 무엇

SQLSTATE[HY000] [2002] ????,??????????? at line 133 in RedBean_Driver_PDO.php. //This is generated by my exception handler 

//These were uncaught and processed by Xdebug 
Fatal error: Uncaught exception 'Exception' with message 'PDO::__construct() [133 

(!) Exception: PDO::__construct() [pdo.--construct]: [2002] ????,??????????? (trying to connect via tcp://localhost:3306) in RedBean_Driver_PDO.php on line 133 

Call Stack 
//Call stack 

? 내 이해는 ExceptionHandler 내에서 던져 예외 모든 예외를 잡을 수 있어야합니다 ExceptionHandler입니다.

업데이트 : 종료시 호출되는 session_write_close을 처리해야한다는 느낌이 들었습니다. session_write_close는 데이터베이스에 액세스해야하지만 데이터베이스는 사용할 수 없습니다. 그런 다음 예외가 발생합니다. 스크립트 실행이 끝났기 때문에 ExceptionHandler을 사용할 수 없으므로 캐치되지 않는 예외가 발생합니다. 이 주변에 어쨌든 있습니까?

나는 Windows 7 컴퓨터에서 mod_cgi를 사용하여 apache 2.2에서 fcgi로 PHP 5.3.9를 실행하고 있습니다.

스택 추적 :

# Time Memory Function 
1 2.0323 767336 ExceptionHandler->handleException() //Initial exception caught + handled 
2 2.0334 773968 Session->write() //Script shutdown started (session_write_close to database) 
3 2.0335 774344 Database->findOne() 
4 2.0335 774640 Database->__call() 
5 2.0335 774728 call_user_func_array() 
6 2.0335 775016 RedBean_Facade::findOne() 
7 2.0335 775016 RedBean_Facade::find() 
8 2.0335 775384 RedBean_OODB->find() 
9 2.0335 775384 RedBean_QueryWriter_AQueryWriter->selectRecord() 
10 2.0335 775448 RedBean_QueryWriter_AQueryWriter->safeTable() 
11 2.0335 775536 RedBean_QueryWriter_AQueryWriter->check() 
12 2.0335 775536 RedBean_Adapter_DBAdapter->escape() 
13 2.0335 775536 RedBean_Driver_PDO->Escape() 
14 2.0335 775536 RedBean_Driver_PDO->connect() 
15 2.0336 776200 PDO->__construct() //Cannot connect to database 
16 4.0433 782768 ErrorHandler->handleError() //Error converted to exception 

나는이 정말 피할 수 없다는 느낌이, 프로덕션 환경 display_errors에 어쨌든 꺼집니다. 그러나,이 솔루션에 만족하지는 못하므로 '깨끗한'것은 아닙니다.

+0

이 당신의 문제를 해결하지 않을 수 있지만,이 코드를 수정하려고 할 수도 붙어 있다고 생각'$ 예외 중> 대해서 getFile()); '$ exception-> getFile());을 읽도록 공간을 제거하여 호출한다. – rdlowrey

+0

try/catch 안에 문제가되는 코드를 감싸고 PDO 예외가 발생할 때 현재 예외 처리기가 무엇인지 확인한다. 어쩌면 다른 구성 요소가 예외 처리기를 등 뒤에서 재설정했을 수 있습니까? – Jon

+0

@rdlowrey : 문제를 해결할 때 오타가되었지만 문제가 해결되었습니다. @ 존 : 시도/catch에서 코드를 래핑하는 시도와 예외를 침묵 수있었습니다. 예외 처리기를 검사했는데 사용중인 'ExceptionHandler'였습니다. 명시 적으로'exit()'를'handleException()'에 추가했지만, 잡히지 않은 예외가 여전히'exit()'후에 출력되고있는 것처럼 보입니다! – F21

답변

1

PHP에서는 치명적인 예외를 catch 할 수 없습니다. 슬프게도! 출력 버퍼를 플러시하는 셧다운 기능을 등록하면 할 수 있습니다. 이미 종료 기능이 있기 때문에 문제가 발생합니다. 나는 이것을 시도 할 것이다 : 그 이외의

// This must be called before any code is executed 
register_shutdown_function('shutdownFunction'); 

function shutdownFunction() { 
    // process code - be careful not to throw another fatal exception 
    try { 
     call_user_func('session_write_close'); 
    } catch() {} 
    ob_clean(); 
} 

을 ... 난 당신이

관련 문제