2012-11-14 89 views
2

例如:如何捕獲MySql錯誤代碼?

SQLSTATE[40001]: Serialization failure: 1213 Deadlock found when trying to get lock; try restarting transaction ROLLING BACK 

我從我的代碼中拋出一個PDOEception得到這個消息。我想攔截錯誤代碼(1213)並給予特定處理。

爲什麼?
例如死鎖意味着我只需要在微秒左右重新提交查詢。其他錯誤,意味着我需要提醒開發人員等)。

現在我不得不代碼(類繼承PDO內):

try{ 
     $this->lastStatement = $sql; 
     $this->lastStatement->execute($params); 
    }catch (PDOException $e){ 
     return $this->error($e); 
    } 

,因爲它似乎沒有錯誤的MySQL所具有的全部範圍,我不能使用的$EgetCode。例如,以下錯誤:SQLSTATE[HY000]: General error: 1205 Lock wait timeout exceeded; try restarting transaction 將返回HY000這是一個非常通用的代碼。用於許多不同的錯誤類型。

我應該解析錯誤信息嗎?

+0

怎麼樣使用'$ e-> getCode()'?它是否會返回任何意義? –

+0

查看下面的答案關於getCode() –

回答

2
$e->getCode(); 

它包含SQLSTATE代碼,其中40001的意思是 「僵局」。

+0

檢查這個與鎖有關的錯誤,我必須採取相同的處理方式,但這次給出了一般錯誤:SQLSTATE [HY000]:一般錯誤:1205鎖超時超時;嘗試重新啓動交易 –

+0

是的,這是更大的問題。除了以編程方式「讀取」字符串之外,我不知道獲取更詳細的錯誤代碼的方法。抱歉。 – deceze

0

現在,我看到的唯一選擇是解析錯誤消息本身並提取四位數的錯誤代碼。

$s='SQLSTATE[HY000]: General error: 1205 Lock wait timeout exceeded; try restarting transaction'; 
$p='/\b[0-9]+/'; 
preg_match($p,$s,$m); 
var_dump($m); 
0

PDO語句具有這樣的功能 - > errorInfo中()返回的有用的信息的陣列 - 檢查$犯錯[2]其中$ ERR是陣列從上面提到的函數返回。