测试 tolua 例子 TestErrorStack

测试 tolua 例子 TestErrorStack

(金庆的专栏 2020.9)

Error1

  1. 点击 “Error1” 按钮
  2. c# showStack.PCall()
  3. lua ShowStack()
  4. c# Test1()
  5. c# try { show.PCall() }
  6. 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

  1. “Instantiate Error”
  2. c# GetFunction(“Instantiate”).PCall()
  3. lua Instantiate()
  4. c# UnityEngine.Object.Instantiate(obj)
  5. c# TestInstantiate.Awake()
  6. c# try { GetFunction(“Show”).PCall() }
  7. lua Show()
  8. 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

  1. “Check Error”
  2. c# GetFunction(“TestRay”).PCall()
  3. lua TestRay() return Vector3.zero
  4. c# 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

  1. “Push Error”
  2. 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

  1. “LuaPushError”
  2. c# GetFunction(“PushLuaError”).PCall()
  3. lua PushLuaError()
  4. lua TestStack.PushLuaError()
  5. c# PushLuaError()
  6. c# try { testRay.Push(Instance); }

仅是警告,没有异常

Check Error

  1. “Check Error”
  2. c# GetFunction(“Test5”).PCall()
  3. lua Test5()
  4. lua TestStack.Test5()
  5. c# Test5()
  6. c# GetFunction(“Test4”).PCall()
  7. lua TestStack.Test4()
  8. c# Test4()
  9. 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

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

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

out of bound

  1. “out of bound”
  2. c# GetFunction(“TestOutOfBound”).PCall()
  3. c# TestOutOfBound()
  4. 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

  1. “TestArgError”
  2. c# GetFunction(“Test8”).PCall()
  3. lua Test8()
  4. lua TestArgError()
  5. c# TestArgError()
  6. 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

  1. “TestFuncDispose”
  2. c# func.Dispose();
  3. 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

  1. “SendMessage”
  2. c# gameObject.SendMessage(“OnSendMsg”);
  3. c# OnSendMsg()
  4. c# try { GetFunction(“TestStack.Test6”).PCall() }
  5. c# Test6()
  6. 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

  1. “SendMessageInLua”
  2. c# GetFunction(“SendMsgError”).PCall()
  3. lua SendMsgError(go)
  4. 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

  1. “AddComponent”
  2. c# GetFunction(“TestAddComponent”).PCall()
  3. c# TestAddComponent()
  4. c# try { go.AddComponent(); }
  5. c# TestInstantiate2.Awake()
  6. 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

  1. “TableGetSet”

TestTableInCo

  1. “TestTableInCo”
  2. c# GetFunction(“TestCoTable”).PCall()
  3. lua TestCoTable()
  4. lua 运行协程 TestCo(…)
  5. lua TestTableInCo(…)
  6. c# TestTableInCo()

Instantiate2 Error

  1. “Instantiate2 Error”
  2. c# GetFunction(“Instantiate”).PCall() with go2
  3. lua Instantiate()
  4. lua UnityEngine.Object.Instantiate(obj)
  5. 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

  1. “Instantiate3 Error”
  2. c# UnityEngine.Object.Instantiate(go2);
  3. 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

  1. “TestCycle”
  2. c# GetFunction(“TestCycle”).PCall()
  3. c# TestCycle()

测试递归调用 luaFunction

TestNull

  1. “TestNull”
  2. c# StartCoroutine(TestCo(action));

c# 中创建协程

TestMulti

  1. “TestMulti”
  2. c# GetFunction(“TestMulStack”).PCall()
  3. c# TestMulStack()
  4. c# try { TestMul0(); }
  5. c# TestMul1()
  6. throw
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值