测试 tolua 例子 TestErrorStack

tech2023-09-27  97

测试 tolua 例子 TestErrorStack

(金庆的专栏 2020.9)

Error1

点击 “Error1” 按钮c# showStack.PCall()lua ShowStack()c# Test1()c# try { show.PCall() }lua Show() error(‘this is error’) LuaException: TestErrorStack:2: this is error stack traceback: [C]: in function 'error' TestErrorStack:2: in function <TestErrorStack:1> [C]: in function 'Test1' TestErrorStack:6: in function <TestErrorStack:5> LuaInterface.LuaState:PCall(Int32, Int32) (at Assets/ToLua/Core/LuaState.cs:758) LuaInterface.LuaFunction:PCall() (at Assets/ToLua/Core/LuaFunction.cs:96) TestLuaStack:Test1(IntPtr) (at Assets/ToLua/Examples/TestErrorStack/TestLuaStack.cs:27) LuaInterface.LuaDLL:lua_pcall(IntPtr, Int32, Int32, Int32) LuaInterface.LuaState:PCall(Int32, Int32) (at Assets/ToLua/Core/LuaState.cs:755) LuaInterface.LuaFunction:PCall() (at Assets/ToLua/Core/LuaFunction.cs:96) TestLuaStack:OnGUI() (at Assets/ToLua/Examples/TestErrorStack/TestLuaStack.cs:375)

lua Show() 中抛 error, 在 C# 中 try-catch 得到, 通过 toluaL_exception() 返回 Lua 调用者 ShowStack(), ShowStack() 中止执行,传递异常到 c# 调用者 OnGUI(), OnGUI()中断执行,打印错误信息。

Instantiate Error

“Instantiate Error”c# GetFunction(“Instantiate”).PCall()lua Instantiate()c# UnityEngine.Object.Instantiate(obj)c# TestInstantiate.Awake()c# try { GetFunction(“Show”).PCall() }lua Show()c# state.ThrowLuaException(e) LuaException: TestErrorStack:2: this is error stack traceback: [C]: in function 'error' TestErrorStack:2: in function <TestErrorStack:1> [C]: in function 'Instantiate' TestErrorStack:12: in function <TestErrorStack:11> LuaInterface.LuaState:PCall(Int32, Int32) (at Assets/ToLua/Core/LuaState.cs:758) LuaInterface.LuaFunction:PCall() (at Assets/ToLua/Core/LuaFunction.cs:96) TestInstantiate:Awake() (at Assets/ToLua/Examples/TestErrorStack/TestInstantiate.cs:15) UnityEngine.Object:Instantiate(Object) UnityEngine_ObjectWrap:Instantiate(IntPtr) (at Assets/ToLua/BaseType/UnityEngine_ObjectWrap.cs:203) LuaInterface.LuaDLL:lua_pcall(IntPtr, Int32, Int32, Int32) LuaInterface.LuaState:PCall(Int32, Int32) (at Assets/ToLua/Core/LuaState.cs:755) LuaInterface.LuaFunction:PCall() (at Assets/ToLua/Core/LuaFunction.cs:96) TestLuaStack:OnGUI() (at Assets/ToLua/Examples/TestErrorStack/TestLuaStack.cs:391)

在 lua 中实例化对象,Awake() 中向lua抛异常:state.ThrowLuaException(e)。 中止了 lua 调用和 OnGUI(), 但是新对象的 Start() 成功调用了。 因为 Awake() 中 catch 了异常,按执行成功处理。 如果 Awake() 中不 catch, Awake() 执行异常,也不会有 Start() 调用,但是lua Instantiate() 执行会成功,打印出对象名。

Check Error

“Check Error”c# GetFunction(“TestRay”).PCall()lua TestRay() return Vector3.zeroc# CheckRay(); //返回值出错 LuaException: bad argument #2 (Ray expected, got Vector3) LuaInterface.LuaDLL:luaL_argerror(IntPtr, Int32, String) (at Assets/ToLua/Core/LuaDLL.cs:692) LuaInterface.LuaDLL:luaL_typerror(IntPtr, Int32, String, String) (at Assets/ToLua/Core/LuaDLL.cs:706) LuaInterface.LuaStatePtr:LuaTypeError(Int32, String, String) (at Assets/ToLua/Core/LuaStatePtr.cs:534) LuaInterface.LuaState:CheckRay(Int32) (at Assets/ToLua/Core/LuaState.cs:1505) LuaInterface.LuaFunction:CheckRay() (at Assets/ToLua/Core/LuaFunction.cs:781) TestLuaStack:OnGUI() (at Assets/ToLua/Examples/TestErrorStack/TestLuaStack.cs:403)

Push Error

“Push Error”c# func.Push(Instance); 14:04:31.371-157: Type TestLuaStack not wrap to lua, push as UnityEngine.MonoBehaviour, the warning is only raised once UnityEngine.Debug:LogWarning(Object) LuaInterface.Debugger:LogWarning(String) LuaInterface.Debugger:LogWarning(String, Object, Object) LuaInterface.LuaState:GetMissMetaReference(Type) (at Assets/ToLua/Core/LuaState.cs:1917) LuaInterface.LuaStatic:GetMissMetaReference(IntPtr, Type) (at Assets/ToLua/Core/LuaStatic.cs:39) LuaInterface.ToLua:LoadPreType(IntPtr, Type) (at Assets/ToLua/Core/ToLua.cs:2608) LuaInterface.ToLua:PushUserObject(IntPtr, Object) (at Assets/ToLua/Core/ToLua.cs:2622) LuaInterface.ToLua:Push(IntPtr, Object) (at Assets/ToLua/Core/ToLua.cs:2636) LuaInterface.LuaState:Push(Object) (at Assets/ToLua/Core/LuaState.cs:1378) LuaInterface.LuaFunction:Push(Object) (at Assets/ToLua/Core/LuaFunction.cs:465) TestLuaStack:OnGUI() (at Assets/ToLua/Examples/TestErrorStack/TestLuaStack.cs:412)

LuaPushError

“LuaPushError”c# GetFunction(“PushLuaError”).PCall()lua PushLuaError()lua TestStack.PushLuaError()c# PushLuaError()c# try { testRay.Push(Instance); }

仅是警告,没有异常

Check Error

“Check Error”c# GetFunction(“Test5”).PCall()lua Test5()lua TestStack.Test5()c# Test5()c# GetFunction(“Test4”).PCall()lua TestStack.Test4()c# Test4()c# try { show.PCall() } LuaException: TestErrorStack:2: this is error stack traceback: [C]: in function 'error' TestErrorStack:2: in function <TestErrorStack:1> [C]: in function 'Test4' TestErrorStack:30: in function <TestErrorStack:29> [C]: in function 'Test5' TestErrorStack:34: in function <TestErrorStack:33> LuaInterface.LuaState:PCall(Int32, Int32) (at Assets/ToLua/Core/LuaState.cs:758) LuaInterface.LuaFunction:PCall() (at Assets/ToLua/Core/LuaFunction.cs:96) TestLuaStack:Test4(IntPtr) (at Assets/ToLua/Examples/TestErrorStack/TestLuaStack.cs:85) LuaInterface.LuaDLL:lua_pcall(IntPtr, Int32, Int32, Int32) LuaInterface.LuaState:PCall(Int32, Int32) (at Assets/ToLua/Core/LuaState.cs:755) LuaInterface.LuaFunction:PCall() (at Assets/ToLua/Core/LuaFunction.cs:96) TestLuaStack:Test5(IntPtr) (at Assets/ToLua/Examples/TestErrorStack/TestLuaStack.cs:102) LuaInterface.LuaDLL:lua_pcall(IntPtr, Int32, Int32, Int32) LuaInterface.LuaState:PCall(Int32, Int32) (at Assets/ToLua/Core/LuaState.cs:755) LuaInterface.LuaFunction:PCall() (at Assets/ToLua/Core/LuaFunction.cs:96) TestLuaStack:OnGUI() (at Assets/ToLua/Examples/TestErrorStack/TestLuaStack.cs:434)

Test Resume

“Test Resume”c# GetFunction(“Test6”).PCall()lua Test6()lua 协程中调用 TestStack.Test6(go)c# toluaL_exception()

lua coroutine resume() 返回 false, 不会有错误。

out of bound

“out of bound”c# GetFunction(“TestOutOfBound”).PCall()c# TestOutOfBound()c# toluaL_exception(L, e) LuaException: Transform child out of bounds stack traceback: [C]: at 0x613c2af0 TestLuaStack:TestOutOfBound(IntPtr) (at Assets/ToLua/Examples/TestErrorStack/TestLuaStack.cs:136) LuaInterface.LuaDLL:lua_pcall(IntPtr, Int32, Int32, Int32) LuaInterface.LuaState:PCall(Int32, Int32) (at Assets/ToLua/Core/LuaState.cs:755) LuaInterface.LuaFunction:PCall() (at Assets/ToLua/Core/LuaFunction.cs:96) TestLuaStack:OnGUI() (at Assets/ToLua/Examples/TestErrorStack/TestLuaStack.cs:454)

TestArgError

“TestArgError”c# GetFunction(“Test8”).PCall()lua Test8()lua TestArgError()c# TestArgError()c# toluaL_exception(L, e) LuaException: TestErrorStack:69: bad argument #1 to 'TestArgError' (number expected, got string) stack traceback: [C]: in function 'TestArgError' TestErrorStack:69: in function <TestErrorStack:68> LuaInterface.LuaDLL:luaL_argerror(IntPtr, Int32, String) (at Assets/ToLua/Core/LuaDLL.cs:692) LuaInterface.LuaDLL:luaL_typerror(IntPtr, Int32, String, String) (at Assets/ToLua/Core/LuaDLL.cs:706) TestLuaStack:TestArgError(IntPtr) (at Assets/ToLua/Examples/TestErrorStack/TestLuaStack.cs:151) LuaInterface.LuaDLL:lua_pcall(IntPtr, Int32, Int32, Int32) LuaInterface.LuaState:PCall(Int32, Int32) (at Assets/ToLua/Core/LuaState.cs:755) LuaInterface.LuaFunction:PCall() (at Assets/ToLua/Core/LuaFunction.cs:96) TestLuaStack:OnGUI() (at Assets/ToLua/Examples/TestErrorStack/TestLuaStack.cs:463)

TestFuncDispose

“TestFuncDispose”c# func.Dispose();c# func.PCall(); LuaException: LuaFunction has been disposed LuaInterface.LuaFunction:BeginPCall() (at Assets/ToLua/Core/LuaFunction.cs:73) TestLuaStack:OnGUI() (at Assets/ToLua/Examples/TestErrorStack/TestLuaStack.cs:473)

SendMessage

“SendMessage”c# gameObject.SendMessage(“OnSendMsg”);c# OnSendMsg()c# try { GetFunction(“TestStack.Test6”).PCall() }c# Test6()c# toluaL_exception(L, e); LuaException: this a lua exception stack traceback: [C]: at 0x613c2af0 [C]: in function 'TestArgError' TestErrorStack:69: in function <TestErrorStack:68> TestLuaStack:Test6(IntPtr) (at Assets/ToLua/Examples/TestErrorStack/TestLuaStack.cs:122) LuaInterface.LuaDLL:lua_pcall(IntPtr, Int32, Int32, Int32) LuaInterface.LuaState:PCall(Int32, Int32) (at Assets/ToLua/Core/LuaState.cs:755) LuaInterface.LuaFunction:PCall() (at Assets/ToLua/Core/LuaFunction.cs:96) TestLuaStack:OnSendMsg() (at Assets/ToLua/Examples/TestErrorStack/TestLuaStack.cs:277) UnityEngine.GameObject:SendMessage(String) TestLuaStack:OnGUI() (at Assets/ToLua/Examples/TestErrorStack/TestLuaStack.cs:481)

SendMessage() 等效于直接调用?

SendMessageInLua

“SendMessageInLua”c# GetFunction(“SendMsgError”).PCall()lua SendMsgError(go)lua go:SendMessage(“OnSendMsg”); LuaException: this a lua exception stack traceback: [C]: at 0x613c2af0 [C]: in function 'SendMessage' TestErrorStack:38: in function <TestErrorStack:37> [C]: in function 'TestArgError' TestErrorStack:69: in function <TestErrorStack:68> TestLuaStack:Test6(IntPtr) (at Assets/ToLua/Examples/TestErrorStack/TestLuaStack.cs:122) LuaInterface.LuaDLL:lua_pcall(IntPtr, Int32, Int32, Int32) LuaInterface.LuaState:PCall(Int32, Int32) (at Assets/ToLua/Core/LuaState.cs:755) LuaInterface.LuaFunction:PCall() (at Assets/ToLua/Core/LuaFunction.cs:96) TestLuaStack:OnSendMsg() (at Assets/ToLua/Examples/TestErrorStack/TestLuaStack.cs:277) UnityEngine.GameObject:SendMessage(String) UnityEngine_GameObjectWrap:SendMessage(IntPtr) (at Assets/Source/Generate/UnityEngine_GameObjectWrap.cs:657) LuaInterface.LuaDLL:lua_pcall(IntPtr, Int32, Int32, Int32) LuaInterface.LuaState:PCall(Int32, Int32) (at Assets/ToLua/Core/LuaState.cs:755) LuaInterface.LuaFunction:PCall() (at Assets/ToLua/Core/LuaFunction.cs:96) TestLuaStack:OnGUI() (at Assets/ToLua/Examples/TestErrorStack/TestLuaStack.cs:488)

和 “SendMessage” 差不多一样。

AddComponent

“AddComponent”c# GetFunction(“TestAddComponent”).PCall()c# TestAddComponent()c# try { go.AddComponent(); }c# TestInstantiate2.Awake()c# state.ThrowLuaException(e); Exception: Instantiate exception 2 LuaInterface.LuaStatePtr.ThrowLuaException (System.Exception e) (at Assets/ToLua/Core/LuaStatePtr.cs:607) TestInstantiate2.Awake () (at Assets/ToLua/Examples/TestErrorStack/TestInstantiate2.cs:16) UnityEngine.GameObject:AddComponent() TestLuaStack:TestAddComponent(IntPtr) (at Assets/ToLua/Examples/TestErrorStack/TestLuaStack.cs:237) LuaInterface.LuaDLL:lua_pcall(IntPtr, Int32, Int32, Int32) LuaInterface.LuaState:PCall(Int32, Int32) (at Assets/ToLua/Core/LuaState.cs:755) LuaInterface.LuaFunction:PCall() (at Assets/ToLua/Core/LuaFunction.cs:96) TestLuaStack:OnGUI() (at Assets/ToLua/Examples/TestErrorStack/TestLuaStack.cs:498)

TableGetSet

“TableGetSet”

TestTableInCo

“TestTableInCo”c# GetFunction(“TestCoTable”).PCall()lua TestCoTable()lua 运行协程 TestCo(…)lua TestTableInCo(…)c# TestTableInCo()

Instantiate2 Error

“Instantiate2 Error”c# GetFunction(“Instantiate”).PCall() with go2lua Instantiate()lua UnityEngine.Object.Instantiate(obj)c# TestInstantiate2:Awake() LuaException: Instantiate exception 2 stack traceback: [C]: in function 'Instantiate' TestErrorStack:13: in function <TestErrorStack:11> [C]: in function 'TestArgError' TestErrorStack:69: in function <TestErrorStack:68> TestInstantiate2:Awake() (at Assets/ToLua/Examples/TestErrorStack/TestInstantiate2.cs:11) UnityEngine.Object:Instantiate(Object) UnityEngine_ObjectWrap:Instantiate(IntPtr) (at Assets/ToLua/BaseType/UnityEngine_ObjectWrap.cs:203) LuaInterface.LuaDLL:lua_pcall(IntPtr, Int32, Int32, Int32) LuaInterface.LuaState:PCall(Int32, Int32) (at Assets/ToLua/Core/LuaState.cs:755) LuaInterface.LuaFunction:PCall() (at Assets/ToLua/Core/LuaFunction.cs:96) TestLuaStack:OnGUI() (at Assets/ToLua/Examples/TestErrorStack/TestLuaStack.cs:573)

Instantiate3 Error

“Instantiate3 Error”c# UnityEngine.Object.Instantiate(go2);c# TestInstantiate2.Awake() Exception: Instantiate exception 2 LuaInterface.LuaStatePtr.ThrowLuaException (System.Exception e) (at Assets/ToLua/Core/LuaStatePtr.cs:607) TestInstantiate2.Awake () (at Assets/ToLua/Examples/TestErrorStack/TestInstantiate2.cs:16) UnityEngine.Object:Instantiate(GameObject) TestLuaStack:OnGUI() (at Assets/ToLua/Examples/TestErrorStack/TestLuaStack.cs:580)

TestCycle

“TestCycle”c# GetFunction(“TestCycle”).PCall()c# TestCycle()

测试递归调用 luaFunction

TestNull

“TestNull”c# StartCoroutine(TestCo(action));

c# 中创建协程

TestMulti

“TestMulti”c# GetFunction(“TestMulStack”).PCall()c# TestMulStack()c# try { TestMul0(); }c# TestMul1()throw
最新回复(0)