標籤:style blog http color 使用 strong io for
調試,這是一個無法規避的問題
C#Light 由於有 詞法解釋、文法解釋、運行時三種情況
所以和C#也是有類似的問題
出錯大致可以分為編譯錯誤和執行階段錯誤
拼字出莫名的東西或者文法不正確,會在編譯階段報錯,這種錯誤很好檢查,因為
C#Light文法是C#的嚴格子集,所有的C#Light指令碼都可以用C#的標準做語法檢查
這也是C#Light基本上是用VisualStudio做編輯器的原因所在,直接作為C#代碼編譯,可以排除大部分的文法問題。
然後剩下的一些作為C#代碼可以編譯過,但是C#Light卻編譯不過,就是因為C#Light是C#的子集,沒有100%的實現C#所有的文法
詞法錯誤C#Light的 tokenParser會拋出異常,觀察此異常即可獲知問題所在
語法錯誤 C#Light的編譯器會拋出異常,同理,觀察異常可知。
不過你還是需要瞭解哪些文法會導致異常
我們先來列出那些不支援的文法:
項目 |
支援 |
不支援 |
注釋 |
支援// |
不支援 /* */ |
基本類型 |
支援int uint bool string float double |
不支援byte char short 等,但可以擴充 |
變數和定義 |
同c#定義變數方式,先定義再使用,可以在定義同時賦值。 例 int i; int j=0; int k=i+1; bool b1; bool b2=true; bool b3=false; |
|
數學計算 |
同c# 支援 + - * / % 五種數學計算 支援 += -= /= *= %= 五種自運算 支援 ++ -- 兩種自增運算,只支援變數在左側 ++i 不支援 i++ 支援 支援 > >= < <= != == && || 八種邏輯運算 支援! 取反 支援三目運算?: |
不支援位元運算 |
迴圈 |
支援 for foreach,支援continue,break,return 支援 if,可以if else嵌套 例 if(i==1) { } else if(i==2) { } else if(i==3) { } else { } |
不支援 while dowhile goto |
命名空間 |
可以寫 Debug.Log(); 不可以寫 UnityEnging.Debug.Log(); C#Evil 頭部可以寫using |
不支援 |
對象調用 |
註冊了類型以後 new 支援 as 和 強制類型轉換 支援 成員變數訪問支援 成員函數調用支援 向類型註冊事件代理支援 支援對象的[] index訪問 靜態支援 C#Evil 可以在指令碼裡編寫class |
指令碼裡編寫的class 不能繼承
|
數組 |
作為類型支援 比如可以將List<int> Dictionary<int,string> 註冊成一個類型總體使用 |
不支援 int[] abc=new int[3]文法 傳入參數有int[] 可以註冊為類型使用。 由於數組是整體註冊一個關鍵字 所以註冊的List<int> 如果註冊關鍵字為”List<int>”,編寫時就不能寫成 List < ini > 不能有空格,要不然關鍵字匹配不上 |
委託 |
支援指令碼編寫函數註冊給程式的委託介面 A.Test+=Func1; A.SetTest(Func1); 兩種形式 |
|
匿名函數 |
|
不支援 |
異常處理 |
|
不支援trycatch |
C#Light能夠有許可權調用的類型需要提前註冊
env.RegType(new CSLE.RegHelper_Type(typeof(UnityEngine.Debug)));
env.RegType(new CSLE.RegHelper_Type(typeof(List<string>),"List<string>"));
env.RegType(new CSLE.RegHelper_Type(typeof(List<int>), "List<int>"));
env.RegType(new CSLE.RegHelper_Type(typeof(List<List<int>>), "List<List<int>>"));
委託的註冊稍微不太一樣
env.RegDeleType(new CSLE.RegHelper_DeleAction("Action"));
env.RegDeleType(new CSLE.RegHelper_DeleAction<int>("Action<int>"));
env.RegDeleType(new CSLE.RegHelper_DeleAction<int,string>("Action<int,string>"));
簡單的類型不用填第二個參數關鍵字。
雖然不支援那一列看起來好多,實際上不會很影響,接下來說明運行時出錯的排查方法
運行時排錯一般有
1.打Log進行判斷
2.斷點調試
2.錯誤上下文分析(堆棧分析、附近變數分析)
C#Light不提供斷點調試功能,關於打Log,這個直接調用Debug.Log即可
錯誤上下文C#Light有著良好的支援
只需要在運行指令碼時try一下,出錯以後用content.DumpValue 可以Dump出指令碼堆棧上的變數值
content.DumpStack 可以Dump出指令碼執行堆棧
再加上異常本身反饋的資訊
這是故意產生了一個錯誤
DumpValue是每一層指令碼函數上的變數
DumpStack就是指令碼堆棧,最上面一行告訴了我們bug所在 Test03.cs的第31行
SystemError是異常拋出的部分