其他路徑:
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();
}
}
}