當前位置: 首頁> 最新文章列表> 為什麼你的PDO::exec 沒有拋出異常?可能是忘記了這一步操作

為什麼你的PDO::exec 沒有拋出異常?可能是忘記了這一步操作

gitbox 2025-09-17

PDO 錯誤處理模式

PDO 默認的錯誤處理模式是PDO::ERRMODE_SILENT ,意味著如果發生了錯誤,PDO 並不會主動拋出異常,而是靜默地處理。這就意味著你在執行SQL 語句時,如果遇到錯誤,PDO 不會自動給你提示或拋出異常,而是你需要手動去檢查錯誤狀態。

如果你希望在發生錯誤時能夠捕獲異常並進行調試,正確的做法是將PDO 的錯誤模式設置為PDO::ERRMODE_EXCEPTION 。這樣,當執行exec()或其他數據庫操作方法時,發生錯誤就會拋出一個異常,你可以通過try-catch來捕獲並處理它。

如何設置PDO 錯誤處理模式?

在創建PDO 實例時,你可以通過setAttribute()方法來設置錯誤處理模式。例如,下面的代碼演示瞭如何啟用異常處理:

 <span><span><span class="hljs-meta">&lt;?php</span></span><span>
</span><span><span class="hljs-keyword">try</span></span><span> {
    </span><span><span class="hljs-comment">// 創建 PDO 實例,並設置錯誤模式為異常</span></span><span>
    </span><span><span class="hljs-variable">$pdo</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title function_ invoke__">PDO</span></span><span>(</span><span><span class="hljs-string">'mysql:host=localhost;dbname=testdb'</span></span><span>, </span><span><span class="hljs-string">'username'</span></span><span>, </span><span><span class="hljs-string">'password'</span></span><span>);
    </span><span><span class="hljs-variable">$pdo</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">setAttribute</span></span><span>(PDO::</span><span><span class="hljs-variable constant_">ATTR_ERRMODE</span></span><span>, PDO::</span><span><span class="hljs-variable constant_">ERRMODE_EXCEPTION</span></span><span>);

    </span><span><span class="hljs-comment">// 執行一個 SQL 語句</span></span><span>
    </span><span><span class="hljs-variable">$sql</span></span><span> = </span><span><span class="hljs-string">"UPDATE users SET name = 'John' WHERE id = 1"</span></span><span>;
    </span><span><span class="hljs-variable">$pdo</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">exec</span></span><span>(</span><span><span class="hljs-variable">$sql</span></span><span>);
} </span><span><span class="hljs-keyword">catch</span></span><span> (PDOException </span><span><span class="hljs-variable">$e</span></span><span>) {
    </span><span><span class="hljs-comment">// 捕獲並處理異常</span></span><span>
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">'數據庫操作失敗: '</span></span><span> . </span><span><span class="hljs-variable">$e</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">getMessage</span></span><span>();
}
</span><span><span class="hljs-meta">?&gt;</span></span><span>
</span></span>

在這個例子中,我們將PDO::ATTR_ERRMODE設置為PDO::ERRMODE_EXCEPTION ,這樣當exec()執行失敗時,PDO 會拋出PDOException異常,我們就可以通過catch語句捕獲到錯誤信息。

為什麼默認不拋出異常?

PDO 的默認錯誤處理模式是為了提高性能,尤其在不需要處理錯誤的場景中,可以減少不必要的開銷。例如,在執行批量的INSERT操作時,可能開發者並不關心每條數據是否成功插入,只關注整體執行是否有問題,這時不拋出異常可以減少代碼的複雜度。

然而,當你需要對數據庫操作進行更嚴格的錯誤檢查時,開啟異常模式就變得至關重要。否則,即使你的SQL 語句寫得有問題,PDO 也不會提示你發生了什麼錯誤。

PDO::exec 和事務

需要注意的是, exec()只會在事務外進行錯誤處理。若你在事務內部使用exec() ,且沒有正確捕獲異常,事務的提交或回滾也不會自動處理。為了更好地控制事務,你應該結合beginTransaction()commit()使用:

 <span><span><span class="hljs-meta">&lt;?php</span></span><span>
</span><span><span class="hljs-keyword">try</span></span><span> {
    </span><span><span class="hljs-variable">$pdo</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">beginTransaction</span></span><span>();

    </span><span><span class="hljs-variable">$sql</span></span><span> = </span><span><span class="hljs-string">"UPDATE users SET name = 'Jane' WHERE id = 1"</span></span><span>;
    </span><span><span class="hljs-variable">$pdo</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">exec</span></span><span>(</span><span><span class="hljs-variable">$sql</span></span><span>);

    </span><span><span class="hljs-variable">$pdo</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">commit</span></span><span>(); </span><span><span class="hljs-comment">// 提交事務</span></span><span>
} </span><span><span class="hljs-keyword">catch</span></span><span> (PDOException </span><span><span class="hljs-variable">$e</span></span><span>) {
    </span><span><span class="hljs-variable">$pdo</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">rollBack</span></span><span>(); </span><span><span class="hljs-comment">// 回滾事務</span></span><span>
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">'事務失敗: '</span></span><span> . </span><span><span class="hljs-variable">$e</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">getMessage</span></span><span>();
}
</span><span><span class="hljs-meta">?&gt;</span></span><span>
</span></span>

這樣可以確保在發生錯誤時,事務能夠被回滾,確保數據庫狀態的一致性。

  • 相關標籤:

    PDO