【原創】C#中級教程學習筆記001-調試和錯誤處理

 其他路徑:

CSDN: https://blog.csdn.net/wodehao0808

微信公衆號:程序喵星人

 

更多資源和視頻教程,QQ:1902686547

 

1. 調試和錯誤處理

1.1 .正常調試

正常調試,主要是指輸出日誌,根據打印的信息進行判斷錯誤所在;

 

1.在visual studio 中,主要通過Console.Write / Console.WriteLine 方法向控制檯輸出信息;

2.在Unity中,主要通過 Debug.Log("") Debug.LogError("") Debug.LogWarn(""),向unity的Console窗口輸出信息;

 

1.2 中斷調試

1.2.1 斷點

斷點是源代碼中自動進入中斷模式的一個標記,當遇到斷點的時候,程序會進入中斷模式。

 

如何插入斷點?

1,右擊代碼行,選擇breakpoint(斷點) -> insert breakpoint(插入斷點)。

2,光標定位到代碼行,選擇菜單上的Debug(調試)->Toggle Breakpoint(切換斷點)。

3,光標定位到代碼行,按下F9鍵,在此按下F9是取消斷點。

4,在需要添加斷點的行首位置,直接單擊,再次單擊取消斷點

1.2.2 斷點窗口

窗口 Breakpoints

 

可以通過 (調試-窗口-斷點),打開斷點窗口,這個窗口顯示了當前項目中添加了的所有的斷點,我們可以在這裏定位斷點的位置,也可以去刪除斷點。

 

1.2.3 監視變量的內容

在中斷模式下查看變量值最簡單的方式,就是把鼠標指向源代碼中的變量名,此時會出現一個工具提示,顯示該變量的信息。

 

中斷模式下的窗口(右下角),有三個選項卡:

    錯誤列表 -程序運行中發生的所有錯誤的列表。

    局部變量 -當前運行環境中所有的局部變量的值。

    監視 -監視某個變量的值的變化。

在上面的幾個窗口中不但可以觀察變量值的變化,還可以直接去修改變量中存儲的值

1.2.4 調用堆棧和即時窗口

在中斷模式下,可以在右下角看到調用堆棧和即時窗口。

 

在調用堆棧窗口:我們可以觀察到當前代碼執行到哪一行了,並且可以看到這個代碼的是被什麼語句調用的。

    即時窗口:我們可以在這裏輸入一些命令,查看變量的值,修改變量的值,可以輸入表達式查看結果。

1.2.5 單步執行代碼

在中斷模式下我們可以單步執行代碼,單步執行帶有有兩種 逐過程和逐語句,他們兩個都是一條語句一條語句的執行,區別在於 逐過程 遇到函數,不會進入函數內部,而把函數當成一條語句去執行。

1.2.6 Example: 斷點

 

 

 

1.3 異常處理

有時,我們知道可能會有錯誤發生,但不能100%的肯定他們不會發生,此時最好能預料到錯誤的發生,編寫足夠健壯的代碼以處理這些錯誤,而不必中斷程序的執行。

異常:是在運行期間代碼中產生的錯誤。

示例:

int[] myArray = {1,2,3,4};

int myEle = myArray[4]; //數組下標越界

運行到這裏的時候,會出現異常,這個異常的定義已經在CLR中定義好了。如果我們不去處理這個異常,那麼當異常發生的時候,程序會終止掉,然後異常後面的代碼都無法執行

我們處理異常的語法結構如下(包含了三個關鍵字 try catch finally)

 

try

{

      

...

}

catch( <exceptionType> e )

{

      

...

}

finally

{

      

}

其中catch塊可以有0或者多個,finally可以有0或者1個。

 

但是如果沒有catch塊,必須有finally塊,沒有finally塊,必須有catch塊,catch塊和finally塊可以同時存在。

 

try塊包含了可能出現異常的代碼(一條或者多條語句)。

    catch塊用來捕捉異常,當代碼發生異常,那麼異常的類型和catch塊中的類型一樣的時候,就會執行該catch塊,如果catch塊的參數不寫,表示發生任何異常都執行這個catch塊。

finally塊包含了始終會執行的代碼,不管有沒有異常產生都會執行。

 

兩個案例:

1, 處理剛剛的下標越界異常。

2,讓用戶輸入兩個數字,用戶可能會出入非數字類型,處理該異常,如果出現該異常就讓用戶重新輸入,輸出這兩個數字的和。

1.3.1 Example: 異常案例1

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

 

// 異常案例1

 

namespace Lesson_1_2

{

    class Program

    {

        static void Main(string[] args)

        {

            // example_1: 處理下標越界異常。

            try

            {

                int[] intArray = { 1, 2, 3, 4 };

                int myEle = intArray[4];

            }

            catch (IndexOutOfRangeException e)

            {

                Console.WriteLine("發生了異常:IndexOutOfRangeException = " + e.Message);

                Console.WriteLine("您訪問數組的時候,下標越界了");

            }

            finally  // 不管有沒有發生異常,finally都會執行

            {

                Console.WriteLine("這裏是 finally 裏面執行的代碼");

            }

            Console.WriteLine("try..catch結束");  // 異常進行了處理,所以發生異常時可以繼續執行後面的代碼

 

            try

            {

                int[] intArray = { 1, 2, 3, 4 };

                int myEle = intArray[4];

            }

            catch (NullReferenceException e)  // 捕捉的異常不匹配,所以這個catch不會執行

            {

                Console.WriteLine("發生了異常:NullReferenceException = " + e.Message);

            }

            catch  // 這個 catch 會捕捉出現的任何異常

            {

                Console.WriteLine("catch 您訪問數組的時候,下標越界了");

            }

            finally

            {

                Console.WriteLine("這裏是 finally 裏面執行的代碼");

            }

            Console.WriteLine("try..catch結束");  // 異常進行了處理,所以發生異常時可以繼續執行後面的代碼

 

 

            Console.ReadKey();

 

        }

    }

}

1.3.2 Example: 異常案例2

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

 

// 異常案例2

 

namespace Lesson_1_3

{

    class Program

    {

        static void Main(string[] args)

        {

            // example_2: 讓用戶輸入兩個數字,用戶可能會出入非數字類型,處理該異常,如果出現該異常就讓用戶重新輸入,輸出這兩個數字的和。

            int iNum1 = 0, iNum2 = 0, iSum = 0;

            Console.WriteLine("請輸入第一個數字:");

            while (true)

            {

                try

                {

                    iNum1 = Convert.ToInt32(Console.ReadLine());  // try中如果語句發生異常,則不會再執行try中剩下的語句。

                    break;  // 沒有發生異常,輸入成功,終止循環

                }

                catch

                {

                    Console.WriteLine("您輸入的不是一個整數,請重新輸入一個數字:");

                }

            }

            Console.WriteLine("請輸入第二個數字:");

            while (true)

            {

                try

                {

                    iNum2 = Convert.ToInt32(Console.ReadLine());  // try中如果語句發生異常,則不會再執行try中剩下的語句。

                    break;  // 沒有發生異常,輸入成功,終止循環

                }

                catch

                {

                    Console.WriteLine("您輸入的不是一個整數,請重新輸入一個數字:");

                }

            }

            iSum = iNum1 + iNum2;

            Console.WriteLine("輸入的數字之和是 = " + iSum);

 

            Console.ReadKey();

        }

    }

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章