mysql 丟擲異常sql mysql 異常處理

2021-10-17 22:20:42 字數 3374 閱讀 1019

--該文章內容通過網路搜尋組合,

mysql 異常,可以自定義異常,再應用。也可使用系統預設的異常,捕獲應用。

一、異常定義:

declare condition_name condition for [condition_type];

condition_name引數表示異常的名稱;

condition_type引數異常型別

condition_type由sqlstate [value] sqlstate_value|mysql_error_code組成:

sqlstate_value和mysql_error_code都可以表示mysql的錯誤;

sqlstate_value為長度為5的字串型別的錯誤**;mysql_error_code為數值型別錯誤**;

舉例:定義「error 1148(42000)」錯誤,名稱為command_not_allowed。可以有以下兩種方法:

//方法一:使用sqlstate_value

declare command_not_allowed condition for sqlstate '42000';

//方法二:使用mysql_error_code

declare command_not_allowed condition for 1148;

二、異常處理

declare handler_type handler for condition_value [,...] sp_statement

handler_type: continue|exit|undo

handler_type為錯誤處理方式,引數為3個值之一;

continue表示遇到錯誤不處理,繼續執行;

exit表示遇到錯誤時馬上退出;

undo表示遇到錯誤後撤回之前的操作,mysql暫不支援回滾操作;

condition_value: sqlstate [value] sqlstate_value| condition_name|sqlwarning|not found|sqlexception|mysql_error_code

condition_value表示錯誤型別;sqlstate [value] sqlstate_value為包含5個字元的字串錯誤值;

condition_name表示declare condition定義的錯誤條件名稱;

sqlwarning匹配所有以01開頭的sqlstate錯誤**;

not found匹配所有以02開頭的sqlstate錯誤**;

sqlexception匹配所有沒有被sqlwarning或not found捕獲的sqlstate錯誤**;

mysql_error_code匹配數值型別錯誤**;

舉例://方法一:捕獲sqlstate_value異常

//這種方法是捕獲sqlstate_value值。如果遇到sqlstate_value值為"42s02",執行continue操作,並輸出"no_such_table"資訊

declare continue handler for sqlstate '42s02' set @info='no_such_table';

//方法二:捕獲mysql_error_code異常

//這種方法是捕獲mysql_error_code值。如果遇到mysql_error_code值為1146,執行continue操作,並輸出"no_such_table"資訊;

declare continue handler for 1146 set @info='no_such_table';

//方法三:先定義條件,然後捕獲異常

declare no_such_table condition for 1146;

declare continue handler for no_such_table set @info='no_such_table';

//方法四:使用sqlwarning捕獲異常

declare exit handler for sqlwarning set @info='error';

//方法五:使用not found捕獲異常

declare exit handler for not found set @info='no_such_table';

//方法六:使用sqlexception捕獲異常

declare exit handler for sqlexception set @info='error';

3.例項

1.create  procedure p_test_excep()

begin

declare exit handler for sqlexception insert into test_log(id) values(1);

start transaction;

insert into test(id) values(11);--主鍵不衝突

insert into test(id) values(1);--主鍵衝突

insert into test(id) values(111);--主鍵不衝突

commit;

end--實際發現,此時日誌表也被回滾了。

2、create  procedure p_test_excep()

begin

declare t_error int default 0;

declare continue handler for sqlexception set t_error=1;

start transaction;

insert into test(id) values(11);--主鍵不衝突

insert into test(id) values(1);--主鍵衝突

insert into test(id) values(111);--主鍵不衝突

if t_error=1 then

rollback;

else

commit;

end if;

end3.

create  procedure p_test_excep()

begin

declare exit handler for sqlexception  begin  rollback ; start transaction;insert into test_log(id) values(1); commit; end;

start transaction;

insert into test(id) values(11);--主鍵不衝突

insert into test(id) values(1);--主鍵衝突

insert into test(id) values(111);--主鍵不衝突

commit;

end--在異常處,先回滾之前開啟的事物,再重新開啟事物,提交日誌資訊。

java throw丟擲異常

1 throws關鍵字通常被應用在宣告方法時,用來指定可能丟擲的異常。多個異常可以使用逗號隔開。當在主函式中呼叫該方法時,如果發生異常,就會將異常拋給指定異常物件。如下面例子所示 public class shoot public static void main string args catch...

python丟擲異常

1 python 使用 raise 語句丟擲乙個指定的異常。raise nameerror hithere traceback most recent call last file line 1,in module raise nameerror hithere nameerror hithere ...

自行丟擲異常

如果throw語句丟擲的異常是checked異常,則該throw語句要麼處於try塊裡,顯式捕獲該異常,要麼放在乙個帶throws宣告丟擲的方法中,即把該異常交給該方法的呼叫者處理 如果throw語句丟擲的異常是runtime異常,既可以顯式捕獲該異常,也可以不用理會該異常,把該異常交給呼叫者處理。...