2016-10-19 3 views
1

나는 PDO PHP는 트랜잭션 코드를 쓰고 있어요 그리고 난 그런 캐치 부분을 작성 계속 :PDOException 클래스가 Exception 클래스를 상속합니까?

try{ 
     $this->db->beginTransaction(); 
     //Some transaction code 
     $this->db->endTransaction(); 
    } catch(Exception $e){ 
     $this->db->cancelTransaction(); 
    } catch (PDOException $e){ 
     $this->db->cancelTransaction(); 
    } 

를 코드는 잘 작동하지만,이 논리 아닌 같은 느낌. catch (Exception $ e)를 사용하고 catch (PDOException $ e) 부분을 제거하는 것으로 충분합니까? PDOException 클래스가 Exception 클래스를 상속합니까?

+0

예외 처리에서 가능한 한 정확해야합니다. 'Exception'은 어떤 종류의 예외도 잡을 수 있습니다. 예를 들어,'ScriptFailedForSomeRandomReasonUnrelatedToYourDatabase'라고 가정 해 봅시다. 여러분의 databasetransaction을 취소하는 에러 처리는 좋지 않을 것입니다. –

+0

[PDOException] (http://php.net/manual/en/class.pdoexception.php)는 [RuntimeException] (http://php.net/manual/en/class.runtimeexception.php)에서 [Exception ] (http://php.net/manual/en/class.exception.php). 프란츠가 말했듯이, 예외 만 잡으면 예상보다 더 많이 잡을 수 있습니다. –

+1

@PatrickQ 그게 당신이 트랜잭션을 롤백하려는 것입니다 –

답변

1

예, 상속됩니다. 예, 논리적이지 않습니다. 예, catch를 사용하는 것만으로 충분합니다 (예외 $ e)

+0

덕분에 PDOException이 Exception에 대한 catch에 걸리므로 완벽한 응답입니다. –

0

PDOExceptionRuntimeExceptionException입니다. 따라서 코드는 논리적이지 않습니다. 두 번째 캐치는 결코 작동하지 않습니다. catch(Exception $e)을 사용하기 만하면됩니다. 그러나 다르게 취급하고 싶다면, 다음과 같은 방법으로 처리해야합니다.

<?php 
    try { 
     $this->db->beginTransaction(); 
     //Some transaction code 
     $this->db->endTransaction(); 

    } catch (PDOException $e) { 
     echo "DataBase Error:".$e->getMessage(); 
    } catch (Exception $e) { 
     echo "General Error".$e->getMessage(); 
    } 
    ?> 
+1

어리석은 echo가 아닌 다른 시나리오를 생각해 주실 수 없습니까? PHP를 사용하는 모든 놈이 echo $ e-> getMessage(); 이제까지 캐치의 유일한 목적입니다. –

+0

나는 그저 할 수있다. – Felix

관련 문제