存儲過程中發生錯誤時,默認行為是「警告繼續、異常終止」。通過 `DECLARE ... HANDLER` 可精準捕獲特定錯誤並自定義處理邏輯(繼續、退出、回滾)。本文系統講解 Handler 語法、六大條件類型、三種動作模式、命名條件最佳實踐,並給出生產級異常處理模板。
類型 匹配範圍 典型場景 默認行為 mysql_error_code 具體 MySQL 錯誤號 (如 1062, 1216) 捕獲具體業務錯誤(主鍵衝突、外鍵失敗) SQLEXCEPTION → EXIT SQLSTATE VALUE 標準 5 字符碼 (如 '23000', 'HY000') 跨數據庫兼容、標準化錯誤處理 同左 condition_name 自定義名稱 (需先 DECLARE CONDITION) 語義化、可維護、團隊協作 同左 SQLWARNING 所有 01xxx 類警告 截斷警告、棄用語法警告 CONTINUE (忽略繼續) NOT FOUND 所有 02xxx 類 (游標無數據、SELECT...INTO 無結果) 游標循環終止控制 CONTINUE (需手動處理) SQLEXCEPTION 除 00/01/02 外所有錯誤 兜底異常捕獲 EXIT (終止過程) 三、 三種動作模式語義
CREATE PROCEDURE `sp_add_location`(
IN in_location VARCHAR(30),
IN in_address1 VARCHAR(30),
IN in_address2 VARCHAR(30),
IN in_zipcode VARCHAR(10),
OUT out_status VARCHAR(30)
)
BEGIN
-- 1. 定義重複鍵處理器(捕獲 1062,設置狀態,繼續執行)
DECLARE CONTINUE HANDLER FOR 1062
SET out_status = 'Duplicate Entry';
-- 2. 默認狀態
SET out_status = 'OK';
-- 3. 執行插入(若重複,Handler 捕獲,out_status 被修改,過程繼續結束)
INSERT INTO `locations` (`location`, `address1`, `address2`, `zipcode`)
VALUES (in_location, in_address1, in_address2, in_zipcode);
END;
錯誤類別 默認 Handler 行為 開發者責任 SQLWARNING (01xxx) CONTINUE (忽略) 關鍵警告需顯式捕獲處理 NOT FOUND (02xxx) CONTINUE (忽略) 游標/SELECT INTO 必須自行聲明 Handler 終止循環 SQLEXCEPTION (其他) EXIT (終止過程) 業務異常需顯式捕獲、記錄、回滾、拋出 八、 生產級異常處理模板(建議封裝為代碼片段)