MySQL定義異常和異常處理方法,MySQL定義處理方法

來源:互聯網
上載者:User

MySQL定義異常和異常處理方法,MySQL定義處理方法

在MySQL中,特定異常需要特定處理。這些異常可以聯絡到錯誤,以及子程式中的一般流程式控制制。定義異常是事先定義程式執行過程中遇到的問題,異常處理定義了在遇到問題時對應當採取的處理方式,並且保證預存程序或者函數在遇到錯誤時或者警告時能夠繼續執行。


1 異常定義1.1 文法

DECLARE condition_name CONDITION FOR [condition_type];

1.2 說明

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為數值類型錯誤碼;
1.3 樣本

定義“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;


2 自訂異常處理2.1 異常處理文法

DECLARE handler_type HANDLER FOR condition_value [,...] sp_statement

2.2 參數說明

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匹配數值類型錯誤碼;


2.3 異常捕獲方法

//方法一:捕獲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 綜合樣本

建立一個表,設定該表的主鍵,在不定義異常處理和定義異常處理情況下看執行到哪一步。

show databases;use wms;create table location(location_id int primary key,location_name varchar(50));

樣本1:不定義異常情況下

DELIMITER //CREATE PROCEDURE handlerInsertNoException()BEGIN/*DECLARE CONTINUE HANDLER FOR SQLSTATE '23000' SET @x2=1;*/SET @x=1;INSERT INTO location VALUES (1,'Beijing');SET @x=2;INSERT INTO location VALUES (1,'Wuxi');SET @x=3;END;//DELIMITER ;
調用預存程序與結果:

mysql> call handlerInsertNoException();ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'mysql> select @x;+------+| @x   |+------+|    2 |+------+1 row in set (0.00 sec)mysql> select * from location;+-------------+---------------+| location_id | location_name |+-------------+---------------+|           1 | Beijing       |+-------------+---------------+1 row in set (0.00 sec) 

注意:操作樣本2前要清空表中資料,並退出重新登入,以免用戶端變數@x影響,詳細說明參見結論中的第一點。

mysql> truncate table location;Query OK, 0 rows affected (0.04 sec)mysql> select * from location;Empty set (0.00 sec)mysql> exit;Byedavid@Louis:~$ mysql -u root -pEnter password: Welcome to the MySQL monitor.  Commands end with ; or \g.Your MySQL connection id is 53Server version: 5.5.38-0ubuntu0.14.04.1 (Ubuntu)mysql> use wms;Reading table information for completion of table and column namesYou can turn off this feature to get a quicker startup with -ADatabase changedmysql> select * from location;Empty set (0.00 sec)mysql> select @x;+------+| @x   |+------+| NULL |+------+1 row in set (0.00 sec)


樣本2:定義異常處理情況下:

DELIMITER //CREATE PROCEDURE handlerInsertWithException()BEGINDECLARE CONTINUE HANDLER FOR SQLSTATE '23000' SET @x2=1;SET @x=1;INSERT INTO location VALUES (1,'Beijing');SET @x=2;INSERT INTO location VALUES (1,'Wuxi');SET @x=3;END;//DELIMITER ;

調用預存程序與結果:

mysql> CALL handlerInsertWithException();Query OK, 0 rows affected (0.09 sec)mysql> select @x;+------+| @x   |+------+|    3 |+------+1 row in set (0.00 sec)

說明與結論:

一、MySQL中,@var_name表示使用者變數,使用SET語句為其賦值,使用者變數與串連有關,一個用戶端定義的變數不能被其他用戶端看到或者使用。當用戶端退出時,該用戶端串連的所有變數將自動釋放。

二、在樣本1中,由於注釋了異常的聲明"",此時向表中插入相同主鍵,就會觸發異常,並且採取預設(EXIT)路徑;且查看此時的@x返回2,表示下面的INSERT語句並沒有執行就退出了.

三、定義了異常處理,此時遇到錯誤也會按照異常定義那樣繼續執行;但只有第一條資料被插入到表中,此時使用者變數@x=3說明已經執行到了結尾;


-----------------------------------------------------------------------------------------------------------------------------

如果您們在嘗試的過程中遇到什麼問題或者My Code有錯誤的地方,請給予指正,非常感謝!

連絡方式:david.louis.tian@outlook.com

著作權@:轉載請標明出處!

mysql的預存程序中怎定義錯誤處理?

declare是用來定義變數和常用處理、聲明之類的關鍵字。在mysql預存程序出現之前declare是一塊雞肋,大家常用declare來定義局部變數,我習慣性的還是使用set來定義變數(雖然是全域的,但是來的方便)。預存程序出現後declare的標準處理定義就變成了非常強大的工具,可以用來為預存程序添加一些非常強大的錯誤處理機制。首先需要提一點的是declare定義變數如果想定義varchar型的,必須註明參數最大長度,即declare varchar(20).在這裡我們不深究它用來定義參數的小細節我們主要來研究DECLARE Condition 和 DECLARE HandlerDECLARE Condition 和 DECLARE Handler可以說是為了處理錯誤而生的。功能上講DECLARE Condition出現的時間比較早,功能也比較簡單,它可以通過錯誤編號或者SQLSTATE來觸發一各名字,說明白一點就是當某個錯誤編號出現的時候替換一個名字給它。這樣調用的時候,我們不用去記一大串錯誤編號了。它的標準文法我們可以在mysql的附註中找到。DECLARE condition_name CONDITION FOR condition_valuecondition_value:例子如下:DECLARE errname CONDITION FOR SQLSTATE '23000'將返回SQLSTATE資訊為23000的錯誤定名為errname這個名字就可以被我們的絕對重頭戲DECLARE Handler調用了,在DECLARE Handler中可以定義錯誤的處理辦法,可以使用begin和end來標記語句塊,可以單獨使用rollback。處理的過程也可以定義為繼續執行和中斷預存程序。標準文法:DECLARE handler_type HANDLER FOR condition_value[,...] sp_statementhandler_type: 處理的過程。CONTINUE 繼續執行未完成的預存程序,直至結束。(常用,預設)| EXIT 出現錯誤即自動跳出所在的begin不再執行後面的語句。condition_value: 處理的觸發條件SQLSTATE [VALUE] sqlstate_value 不用說了,最常用的錯誤定義,自己去查錯誤清單吧。| condition_name 我們剛剛定義的那個名字errnmae就是用在這裡的。| SQLWARNING 這個太好用了,從錯誤編號01開始的錯誤。相當於錯誤的萬用字元。| NOT FOUND 和上面差不多,從02開始。| SQLEXCEPTION 上面兩個中沒有包括的錯誤它都可以用來觸發,就是說你想定義只要出錯就觸發的話就定義出錯條件為SQLWARNING+SQLEXCEPTION。| mysql_error_code 錯誤編號,和第一個不一樣,不過同樣可以在錯誤清單從中查到,是我比較常用的。例子DECLARE errname CONDITION FOR SQLSTATE '23000'; 給導致錯誤23000的錯誤定義名字為errnameDECLARE continue handler for errname 當errname發生時作下面的處理BEGIN 語句開始set @x=1; 設定@x=1
 
mysql怎定義拋出錯誤讓外部程式捕捉到

使用Windows作業系統的人有時會遇到這樣的錯誤資訊:
「“0X????????”指令引用的“0x00000000”記憶體,該記憶體不能為“read”或“written”」,然後應用程式被關閉。
如果去請教一些「高手」,得到的回答往往是「Windows就是這樣不穩定」之類的義憤和不屑。其實,這個錯誤並不一定是Windows不穩定造成的。本文就來簡單分析這種錯誤的一般原因。
一、應用程式沒有檢查記憶體配置失敗
程式需要一塊記憶體用以儲存資料時,就需要使用作業系統提供的「功能函數」來申請,如果記憶體配置成功,函數就會將所新開闢的記憶體區地址返回給應用程式,應用程式就可以通過這個地址使用這塊記憶體。這就是「動態記憶體分配」,記憶體位址也就是編程中的「游標」。記憶體不是永遠都招之即來、用之不盡的,有時候記憶體配置也會失敗。當分配失敗時系統函數會返回一個0值,這時傳回值「0」已不表示新啟用的遊標,而是系統嚮應用程式發出的一個通知,告知出現了錯誤。作為應用程式,在每一次申請記憶體後都應該檢查傳回值是否為0,如果是,則意味著出現了故障,應該採取一些措施挽救,這就增強了程式的「健壯性」。若應用程式沒有檢查這個錯誤,它就會按照「思維慣性」認為這個值是給它分配的可用遊標,繼續在之後的執行中使用這塊記憶體。真正的0地址記憶體區儲存的是電腦系統中最重要的「中斷描述符表」,絕對不允許應用程式使用。在沒有保護機制的作業系統下(如DOS),寫資料到這個地址會導致立即當機,而在健壯的作業系統中,如
Windows等,這個操作會馬上被系統的保護機制捕獲,其結果就是由作業系統強行關閉出錯的應用程式,以防止其錯誤擴大。這時候,就會出現上述的「寫記憶體」錯誤,並指出被引用的記憶體位址為「0x00000000」。記憶體配置失敗故障的原因很多,記憶體不夠、系統函數的版本不匹配等都可能有影響。因此,這種分配失敗多見於作業系統使用很長時間後,安裝了多種應用程式(包括無意中「安裝」的病毒程式),更改了大量的系統參數和系統檔案之後。
二、應用程式由於自身BUG引用了不正常的記憶體游標
在使用動態分配的應用程式中,有時會有這樣的情況出現:程式試突讀寫一塊「應該可用」的記憶體,但不知為什麼,這個預料中可用的游標已經失效了。有可能是「忘記了」向作業系統要求分配,也可能是程式自己在某個時候已經登出了這塊記憶體而「沒有留意」等等。登出了的記憶體被系統回收,其訪問權已經不屬於該應用程式,因此讀寫操作也同樣會觸發系統的保護機制,企圖「違法」的程式唯一的下場就是被操作終止執行,回收全部資源。電腦世界的法律還是要比人類有效和嚴厲得多啊!像這樣的情況都屬於程式自身的BUG,你往往可在特定的操作順序下重現錯誤。無效游標不一定總是0,因此錯誤提示中的記憶體位址也不一定為「0x00000000」,而是其它隨機數字。如果系統經常有所提到的錯誤提示,下面的建議可能會有說明

1.檢視系統中是否有木馬或病毒。這類程式為了控制系統往往不負責任地修改系統,
從而導致作業系統異常。平常應加強資訊安全意識,對來源不明的可執行程式絕不好奇。
2.更新作業系統,讓作業系統的安裝程式重新拷貝正確版本的系統檔案、修正系統參數。
有時候作業系統本身也會有BUG,要注意安裝官方發行的升級程式。
3.試用新版本的應用程式。
Mode:
將虛擬記憶體撤換
答案:
目前為止是肯定的,也就是如在下次冷天到來時亦沒再發生,就代表這是主因
追加:
如果你用
Ghost 恢複 OS 後建議 刪除WINDOWS\PREFETCH目錄下所有*.PF檔案因為需讓win......餘下全文>>
 

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.