異常處理的3原則是
異常處理的3原則是:
1、能處理就早處理,拋出不去還不能處理的就想法消化掉或者轉換為RuntimeException處理。因為對于一個應用系統(tǒng)來說,拋出大量異常是有問題的,應該從程序開發(fā)角度盡可能的控制異常發(fā)生的可能。
2、對于檢查異常,如果不能行之有效的處理,還不如轉換為RuntimeException拋出。這樣也讓上層的代碼有選擇的余地――可處理也可不處理。
3、對于一個應用系統(tǒng)來說,應該有自己的一套異常處理框架,這樣當異常發(fā)生時,也能得到統(tǒng)一的處理風格,將優(yōu)雅的異常信息反饋給用戶。
擴展資料:
各種編程語言在處理異常方面具有非常顯著的不同點(錯誤檢測與異常處理區(qū)別在于:錯誤檢測是在正常的程序流中,處理不可預見問題的代碼,例如一個調用操作未能成功結束)。某些編程語言有這樣的函數(shù):當輸入存在非法數(shù)據時不能被安全地調用,或者返回值不能與異常進行有效的區(qū)別。
例如,C語言中的atoi函數(shù)(ASCII串到整數(shù)的轉換)在輸入非法時可以返回0。在這種情況下編程者需要另外進行錯誤檢測(可能通過某些輔助全局變量如C的errno),或進行輸入檢驗(如通過正則表達式),或者共同使用這兩種方法。
通過異常處理,我們可以對用戶在程序中的非法輸入進行控制和提示,以防程序崩潰。
從進程的視角,硬件中斷相當于可恢復異常,雖然中斷一般與程序流本身無關。
從子程序編程者的視角,異常是很有用的一種機制,用于通知外界該子程序不能正常執(zhí)行。如輸入的數(shù)據無效(例如除數(shù)是0),或所需資源不可用(例如文件丟失)。如果系統(tǒng)沒有異常機制,則編程者需要用返回值來標示發(fā)生了哪些錯誤。
參考資料來源:百度百科——異常處理
計算機中異常處理是什么?
錯誤處理就是根據不同異常做的備用方案及處理方法。常見的說法叫異常處理。
1.由于 Lua 是一門嵌入式擴展語言,其所有行為均源于宿主程序中 C 代碼對某個 Lua 庫函數(shù)的調用。 (單獨使用 Lua 時,lua 程序就是宿主程序。) 所以,在編譯或運行 Lua 代碼塊的過程中,無論何時發(fā)生錯誤, 控制權都返回給宿主,由宿主負責采取恰當?shù)拇胧ū热绱蛴″e誤消息)。
2.可以在 Lua 代碼中調用 error 函數(shù)來顯式地拋出一個錯誤。 如果你需要在 Lua 中捕獲這些錯誤, 可以使用 pcall 或 xpcall 在 保護模式 下調用一個函數(shù)。
無論何時出現(xiàn)錯誤,都會拋出一個攜帶錯誤信息的 錯誤對象 (錯誤消息)。 Lua 本身只會為錯誤生成字符串類型的錯誤對象, 但你的程序可以為錯誤生成任何類型的錯誤對象, 這就看你的 Lua 程序或宿主程序如何處理這些錯誤對象。
3.使用 xpcall 或 lua_pcall 時, 你應該提供一個 消息處理函數(shù) 用于錯誤拋出時調用。 該函數(shù)需接收原始的錯誤消息,并返回一個新的錯誤消息。 它在錯誤發(fā)生后棧尚未展開時調用, 因此可以利用棧來收集更多的信息, 比如通過探知棧來創(chuàng)建一組棧回溯信息。 同時,該處理函數(shù)也處于保護模式下,所以該函數(shù)內發(fā)生的錯誤會再次觸發(fā)它(遞歸)。 如果遞歸太深,Lua 會終止調用并返回一個合適的消息。
。 如果你需要在 Lua 中捕獲這些錯誤, 可以使用 pcall 或 xpcall 在 保護模式 下調用一個函數(shù)。
4.無論何時出現(xiàn)錯誤,都會拋出一個攜帶錯誤信息的 錯誤對象 (錯誤消息)。 Lua 本身只會為錯誤生成字符串類型的錯誤對象, 但你的程序可以為錯誤生成任何類型的錯誤對象, 這就看你的 Lua 程序或宿主程序如何處理這些錯誤對象。
5.可以在 Lua 代碼中調用 error 函數(shù)來顯式地拋出一個錯誤。 如果你需要在 Lua 中捕獲這些錯誤, 可以使用 pcall 或 xpcall 在 保護模式 下調用一個函數(shù)。
6.無論何時出現(xiàn)錯誤,都會拋出一個攜帶錯誤信息的 錯誤對象 (錯誤消息)。 Lua 本身只會為錯誤生成字符串類型的錯誤對象, 但你的程序可以為錯誤生成任何類型的錯誤對象, 這就看你的 Lua 程序或宿主程序如何處理這些錯誤對象。
7.使用 xpcall 或 lua_pcall 時, 你應該提供一個 消息處理函數(shù) 用于錯誤拋出時調用。 該函數(shù)需接收原始的錯誤消息,并返回一個新的錯誤消息。 它在錯誤發(fā)生后棧尚未展開時調用, 因此可以利用棧來收集更多的信息, 比如通過探知棧來創(chuàng)建一組棧回溯信息。 同時,該處理函數(shù)也處于保護模式下,所以該函數(shù)內發(fā)生的錯誤會再次觸發(fā)它(遞歸)。 如果遞歸太深,Lua 會終止調用并返回一個合適的消息。
計算機中異常處理有什么方式?
try 語句可為一組語句指定異常處理器和/或清理代碼:
1.子句指定一個或多個異常處理程序。 當 try 子句中沒有發(fā)生異常時,沒有任何異常處理程序會被執(zhí)行。 當 try 子句中發(fā)生異常時,將啟動對異常處理程序的搜索。 此搜索會逐一檢查 except 子句直至找到與該異常相匹配的子句。 如果存在無表達式的 except 子句,它必須是最后一個;它將匹配任何異常。 對于帶有表達式的 except 子句,該表達式會被求值,如果結果對象與發(fā)生的異常“兼容”則該子句將匹配該異常。 如果一個對象是異常對象所屬的類或基類,或者是包含兼容該異常的項的元組則兩者就是兼容的。
2.如果沒有 except 子句與異常相匹配,則會在周邊代碼和發(fā)起調用棧上繼續(xù)搜索異常處理器。 1
3.如果在對 except 子句頭中的表達式求值時引發(fā)了異常,則原來對處理器的搜索會被取消,并在周邊代碼和調用棧上啟動對新異常的搜索(它會被視作是整個 try 語句所引發(fā)的異常)。
當找到一個匹配的 except 子句時,該異常將被賦值給該 except 子句在 as 關鍵字之后指定的目標,如果存在此關鍵字的話,并且該 except 子句體將被執(zhí)行。 所有 except 子句都必須有可執(zhí)行的子句體。 當?shù)竭_子句體的末尾時,通常會轉向整個 try 語句之后繼續(xù)執(zhí)行。 (這意味著如果對于同一異常存在有嵌套的兩個處理器,而異常發(fā)生于內層處理器的 try 子句中,則外層處理器將不會處理該異常。)
4.當使用 as 將目標賦值為一個異常時,它將在 except 子句結束時被清除。 這就相當于
這意味著異常必須賦值給一個不同的名稱才能在 except 子句之后引用它。 異常會被清除是因為在附加了回溯信息的情況下,它們會形成堆棧幀的循環(huán)引用,使得所有局部變量保持存活直到發(fā)生下一次垃圾回收。
5.函數(shù)的返回值是由最后被執(zhí)行的 return 語句所決定的。 由于 finally 子句總是被執(zhí)行,因此在 finally 子句中被執(zhí)行的 return 語句總是最后被執(zhí)行的:
當找到一個匹配的 except 子句時,該異常將被賦值給該 except 子句在 as 關鍵字之后指定的目標,如果存在此關鍵字的話,并且該 except 子句體將被執(zhí)行。 所有 except 子句都必須有可執(zhí)行的子句體。 當?shù)竭_子句體的末尾時,通常會轉向整個 try 語句之后繼續(xù)執(zhí)行。 (這意味著如果對于同一異常存在有嵌套的兩個處理器,而異常發(fā)生于內層處理器的 try 子句中,則外層處理器將不會處理該異常。)
異常處理的名詞解釋
異常處理,英文名為exceptional handling, 是代替日漸衰落的error code方法的新法,提供error code 所未能具體的優(yōu)勢。異常處理分離了接收和處理錯誤代碼。這個功能理清了編程者的思緒,也幫助代碼增強了可讀性,方便了維護者的閱讀和理解。
異常處理(又稱為錯誤處理)功能提供了處理程序運行時出現(xiàn)的任何意外或異常情況的方法。異常處理使用 try、catch 和 finally 關鍵字來嘗試可能未成功的操作,處理失敗,以及在事后清理資源。
異常處理通常是防止未知錯誤產生所采取的處理措施。異常處理的好處是你不用再絞盡腦汁去考慮各種錯誤,這為處理某一類錯誤提供了一個很有效的方法,使編程效率大大提高。
異常可以由公共語言運行庫(CLR)、第三方庫或使用 throw 關鍵字的應用程序代碼生成。
開發(fā)中異常處理有哪些方法呢?
異常處理可以通過編程處理選擇的異常是可行的。
1.看一下下面的例子:它會一直要求用戶輸入,直到輸入一個合法的整數(shù)為止,但允許用戶中斷這個程序(使用 Control-C 或系統(tǒng)支持的任何方法)。注意:用戶產生的中斷會引發(fā)一個 KeyboardInterrupt 異常。
>>> while True:
... try:
... x = int(input("Plea enter a number: "))
... break
... except ValueError:
... print("Oops! That was no valid number. Try again...")
...
2.try 語句按如下方式工作。
首先,執(zhí)行 try 子句 (在 try 和 except 關鍵字之間的部分)。
如果沒有異常發(fā)生, except 子句 在 try 語句執(zhí)行完畢后就被忽略了。
如果在 try 子句執(zhí)行過程中發(fā)生了異常,那么該子句其余的部分就會被忽略。
如果異常匹配于 except 關鍵字后面指定的異常類型,就執(zhí)行對應的except子句。然后繼續(xù)執(zhí)行 try 語句之后的代碼。
如果發(fā)生了一個異常,在 except 子句中沒有與之匹配的分支,它就會傳遞到上一級 try 語句中。
如果最終仍找不到對應的處理語句,它就成為一個 未處理異常,終止程序運行,顯示提示信息。
一個 try 語句可能包含多個 except 子句,分別指定處理不同的異常。至多只會有一個分支被執(zhí)行。異常處理程序只會處理對應的 try 子句中發(fā)生的異常,在同一個 try 語句中,其他子句中發(fā)生的異常則不做處理。一個 except 子句可以在括號中列出多個異常的名字,例如:
... except (RuntimeError, TypeError, NameError):
... pass
最后一個 except 子句可以省略異常名稱,以作為通配符使用。你需要慎用此法,因為它會輕易隱藏一個實際的程序錯誤!可以使用這種方法打印一條錯誤信息,然后重新拋出異常(允許調用者處理這個異常):
生產異常的處理方法有哪些?
本文發(fā)布于:2023-02-28 18:57:00,感謝您對本站的認可!
本文鏈接:http://m.newhan.cn/zhishi/a/167759114248155.html
版權聲明:本站內容均來自互聯(lián)網,僅供演示用,請勿用于商業(yè)和其他非法用途。如果侵犯了您的權益請與我們聯(lián)系,我們將在24小時內刪除。
本文word下載地址:異常處理(異常處理三原則).doc
本文 PDF 下載地址:異常處理(異常處理三原則).pdf
| 留言與評論(共有 0 條評論) |