2010-04-18 7 views
2

Kohana 2를 사용하고 있습니다. 서버에 연결할 수없는 경우 오류 페이지를 방지하기 위해 데이터베이스 예외를 catch하고 싶습니다.Kohana에서 캐치 데이터베이스 예외가 발생했습니다.

표시되는 오류는 데이터베이스 서버는이 시점에서 모든

system/libraries/drivers/Database/Mysql.php [61]: 

mysql_connect() [function.mysql-connect]: Lost connection to MySQL server at 
'reading initial communication packet', system error: 110 

도달 할 수 없습니다입니다.

저는 모델에서이 작업을하고 있습니다. 나는

try 
{ 
    $hoststatus = $this->db->query('SELECT x FROM y WHERE z;'); 
} 
catch (Exception $e) 
{ 
    die('Database error occured'); 
} 

뿐만 아니라 모두

public function __construct() 
{ 
    // load database library into $this->db 
    try 
    { 
     parent::__construct(); 
    } 
    catch (Exception $e) 
    { 
     die('Database error occured'); 
    } 
} 

을 시도 ...하지만 그들 중 누구도 일 것 같았다. 주 모델에서 예외가 전달되지 않는 것처럼 보입니다. 데이터베이스 오류를 잡아 내 자신의 오류 처리를 사용하는 또 다른 방법이 있습니까?

답변

1

Kohana 2는 오류를 예외로 변환하지 않습니다. 오류 처리기를 연결하거나 error_reporting()을 사용하여 (일시적으로) 오류를 해제 한 다음 일종의 처리를 수행해야합니다.

+0

감사합니다. 내가 전화를 걸거나 데이터베이스 연결을 사용하는 지점에서 오류를 처리 할 수 ​​있습니까? 아니면 코어/데이터베이스 파일을 편집해야합니까? –

0

나는 Kohana를 모르지만, try .. catch 블록은 정상적인 오류를 잡아 내지 못합니다. 단지 Exception입니다. Kohana가 Exception을 수신 할 것으로 예상되는 곳에서 Exception을 던 졌는지 확인 하시겠습니까? 당신 의견에 따라

편집 :
글쎄, 우선, 프로덕션 환경에서 (라이브 응용 프로그램을 의미) 당신은 항상 화면에 PHP 오류의 표시를 사용하지 않도록 설정해야합니다. 화면에 이러한 오류를 표시하는 것은 개발자에게 알리기 위해 개발 환경에서만 수행해야합니다. 그러나 라이브 애플리케이션을 방문하는 사용자는 환경에 대한 중요한 정보를 공개 할 수 있으므로 PHP 오류를 알고 있거나 읽는 데 아무런 성과가 없습니다. 그러나 오류를 로그 파일에 기록해야합니다.

또한 Kohana를 살펴 보았는데 예외적으로 예외가 발생하지만 일관된 방식으로 처리하지는 않습니다.

PHP 오류를 예외로 처리하려면 # this documentation의 예 1이 필요합니다.

+0

내가 아는 한 Kohana는 쿼리가 실행되면 (데이터베이스 클래스가 인스턴스화되지 않을 때) Kohana_Database_Exception을 던져야합니다. 물론 코어 파일을 편집하고 싶지는 않습니다. 이 사람은 답을 얻지 않고도 똑같은 문제가 있습니다. http://forum.kohanaphp.com/comments.php?DiscussionID=4874&page=1#Item_0 –

+0

사실 당신이 옳을 수도 있습니다. stacktrace의 맨 윗줄 주위에 try-catch-block을 추가했습니다 (코어 파일 내부). 어떤 예외도 잡지 못했습니다. 나는 Kohana 포럼에서 새로운 문제를 만들었습니다. http://forum.kohanaphp.com/comments.php?DiscussionID=5425 표준 오류 페이지가 표시되지 않도록 예외 대신 오류를 잡을 수있는 방법이 있습니까? –

+0

@ 대니로 : 내 편집을 참조하십시오. –

1

예외를 catch 할 수는 있지만 잘못된 위치에서 catch하려고 시도했을 가능성이 큽니다. 저수준의 예외를 잡으려고 할 때의 문제점은 여러 다른 소스에서 생성 될 수 있다는 것입니다.

예를 들어 세션 용 데이터베이스 드라이버를 사용하는 경우 세션 라이브러리에서 데이터베이스 드라이버의 인스턴스화에서 예외가 발생합니다 (세션 호출시 인스턴스화되는데 이는 모델을 인스턴스화하기 전에 발생합니다) .

모델에서 발생할 수있는 예외를 잡기하지만 다른 소스에서 일어날 가능성이 높습니다 - 당신은 아마 몇 가지 라이브러리를 확장하거나 기본 모델 parent::__construct 전화를 포장하고 있는지 확인해야하는 경우 세션 라이브러리는 try-catch 블록에 있습니다.

도움이

희망을 (개인적으로 기본 모델에 넣어 대신 그 작업을 수행 할 모델 라이브러리를 확장 할 것이다).

관련 문제