程式語言中的那些異常處理和錯誤——小菜
作為一個小菜的我,雖然學業不精,但是到現在已經學習過程式語言Visual Basic、後來又利用一小點時間自學過C++、這些天接著又見識了C#……
那時候還沒有深刻的體會好好學習這幾個字,VB的總體框架還記得,C++由於是為了考試而在短時間內學的,所以基本都忘光了。是C#重新給了我希望,看著雖然像是一個陌生的語言,但是漸漸的學下去的時候發現,它能讓我想起很多VB和C++忘記的東西,所以學起來也就開心了……
今天學到了C#中的異常處理機制。這讓我想起了C++、VB中都有相關的異常處理機制。
在程式設計編制的過程中,總是沒有辦法避免錯誤,然而,對於使用方法給引發的錯誤要在程式執行過程中儘可能作出處理,即異常處理。對於比較大的軟體來說,在程式測試的過程中也往往會出現錯誤,但是查詢錯誤要比改正錯誤難的多,所以,除錯的方法也很重要。
----------------C#篇
首先,異常也是一種錯誤,它可導致程式不能正確執行,會出現系統崩潰等問題。所以,在程式的編制過程中,程式都必須處理可能出現的異常。C#使用的方法是:採用異常類Exception為每種錯誤提供定製的處理,並把識別錯誤的程式碼和處理錯誤的程式碼分離開來。一般要把程式的相關部分分為三種不同型別的程式碼塊:
C#中的異常處理怎樣使用呢?
namespace yichangchuli { class Program { static void Main(string[] args) { string userInput; while (true ) { try { Console.WriteLine("請輸入0 至5之間的數字,或者回車退出"); userInput = Console.ReadLine(); if (userInput == "") break; int index = Convert.ToInt32(userInput); //超出下標,丟擲一個異常 if (index < 0 || index > 5) throw new IndexOutOfRangeException("您輸入的有誤"); Console.WriteLine("您的數字是:"+index ); } catch (IndexOutOfRangeException ex) { Console.WriteLine("Indexoutof 異常:" + "數字必須是0 至5之間的" + ex.Message); } catch (Exception exc) { Console .WriteLine ("錯誤是:",exc.Message ); } finally { Console .WriteLine ("謝謝您的使用"); } } } }
2、丟擲異常
當你必須捕獲異常時,必須首先能夠引發異常。但是當不能引發異常時,可以通過throw方法引發異常,這是為了告訴程式呼叫者,程式產生的錯誤結果由於他們的呼叫引起的。如
3、C#中一些常用的異常類
SystemException類和ApplicationException類。它們是Exception的直接派生類中最常用的兩個。SystemException類是System名稱空間中所有其他異常類的基類。ApplicationException類則表示應用程式發生非異常錯誤時所引發的異常。由公共語言執行時引發的異常,通常使用SystemException。而由應用程式自身引發的異常,則通常使用ApplicationException。
異常類 |
描述 |
|
與引數有關的 |
ArgumentException |
引數錯誤:方法的引數無效 |
ArgumentNullException |
引數為空:給方法傳遞一個不可接受的空引數 |
|
FormatException |
引數的格式不正確 |
|
與成員訪問有關的 |
MemberAccessException |
表示訪問類的成員失敗所引發的異常,原因可能是沒有足夠的訪問許可權,也可能是要訪問的成員根本不存在。 |
與陣列有關的 |
IndexOutOfRangeException |
下標超過陣列長度時 |
ArrayTypeMismatchException |
檢視在陣列中儲存型別不正確的元素時 |
|
RankException |
如果使用了維數錯誤的陣列 |
|
與算術有關的 |
ArithmeticException |
數學計算錯誤:由於數學運算導致的異常,是一個與算術有關的所有異常類的基類。 |
DivideByZeroExceptiong |
表示整數或十進位制運算中檢視除以零時所引發的異常 |
|
關於溢位 |
OverfolwException |
溢位 |
StackOverfolwException |
棧溢位 |
4、C#中還提供了對程式編譯的兩種輔助手段,即跟蹤和除錯,用於檢出或發現程式中的錯誤。
(1)除錯
設定斷點除錯,
監視變數執行:在中斷方式下,可以設定監視,用於顯示變數的資訊。
逐語句和逐過程除錯
(2)跟蹤
使用ASP開發應用程式是,一般講輸入輸出語句插入到程式碼中,檢查變數或結構,斷言是否正確,或者只是通過應用程式的執行路徑進行的一般跟蹤。C#中提供了來自System.Diagnostics名稱空間下的處理跟蹤和斷言的兩個類:Trace和Debug。
------------ C++篇
在一個小的程式中,可以用比較簡單的方法處理異常。但是在一個大的系統中,如果在每一個函式中都設定處理異常的程式段,會使程式過於複雜和龐大。因此,C++採取的辦法是:如果在執行一個函式過程中出現異常,可以不在本函式中立即處理,而是發出一個資訊,傳給它的上一級(即呼叫它的函式),它的上級捕捉到這個資訊後進行處理。如果上一級的函式也不能處理,就再傳給其上一級,由其上一級處理。如此逐級上送,如果到最高一級還無法處理,最後只好異常終止程式的執行。
這樣做使異常的發現與處理不由同一函式來完成。好處是使底層的函式專門用於解決實際任務,而不必再承擔處理異常的任務,以減輕底層函式的負擔,而把處理異常的任務上移到某一層去處理。這樣可以提高效率。
C++處理異常的機制是由3個部分組成的:
即檢查(try)、丟擲(throw)和捕捉(catch)。把需要檢查的語句放在try塊中,throw用來當出現異常時發出一個異常資訊,而catch則用來捕捉異常資訊,如果捕捉到了異常資訊,就處理它。
(1)throw語句一般是由throw運算子和一個數據組成的,其形式為
throw 表示式;
(2) try-catch的結構為
try
{被檢查的語句}
catch(異常資訊型別 [變數名])
{進行異常處理的語句}
------------ VB篇
VB程式中也會有錯誤的出現,但是VB中提供了一些處理錯誤的方法。使用On error Goto語句在一個過程中指定錯誤處理程式碼所在。接著On error Goto語句關閉錯誤陷阱,然後On error Resume Next 語句用來改變錯誤陷阱,相當於一個跳轉語句,仍能保持程式繼續執行,跳過錯誤的程式碼程式塊。
我自己體驗過的錯誤處理就上面一個,當然強大的VB還有很多處理錯誤的方式。下面是在網上搬下來的:
利用VB的編譯選項,VB有兩個設定項會在很大程度上影響我們建立非常堅實的程式碼的能力。一個設定項是Compile On Demand(按需要進行編譯),另一個設定項是Background Compile(後臺編譯)。可以開啟Options對話方塊,選定General選項卡,然後對這兩個設定項進行設定。當選定Compile On Demand時,如果單擊工具欄上的Run按鈕,或者按F5鍵,VB並不全面編譯我們的專案。相反,只在引用過程時,才對這些過程進行編譯。使用Compile On Demand,通常可使比較大的專案或者速度較慢的計算機上的專案能夠更快地啟動執行,但是它也會產生某些不被注意的編譯錯誤。在發現和糾正所有編譯錯誤之前,不能將專案編譯成.exe或.dll之類的可釋出檔案,因此,選定Compile On Demand並不能夠釋出帶有編譯錯誤的程式碼。但是,選定Compile On Demand後,會導致編譯錯誤隨著時間的推移而不斷增加,從而在最後試圖進行全面編譯時,迫使我們對程式碼進行大量的糾錯。如果在IDE中除錯專案,VB常常必須停止(不只是暫停)執行,以便進行糾錯操作。這使得除錯正在執行的專案時對大量編譯錯誤的糾正操作變得非常麻煩。如果能夠在合理的時間內全面編譯專案,那麼可以考慮關閉Compile On Demand。也可以使Compile On Demand保持選定狀態,但是要定期按Ctrl+F5鍵,以便重新執行我們的專案。這使我們在程式設計時能夠定期糾正編譯錯誤,而不必一次性糾正大量的編譯錯誤。