修复部分启动瞬间报错会导致闪退

This commit is contained in:
MrZ626
2021-03-19 01:24:35 +08:00
parent 6aed6a0926
commit 0e0d88d755

View File

@@ -356,53 +356,106 @@ local function secondLoopThread()
repeat yield()until mainLoop()
end
function love.errorhandler(msg)
--Generate error message
local errData={}
errData.mes={"Error:"..msg}
local c=2
for l in debug.traceback("",2):gmatch("(.-)\n")do
if c>2 then
if not l:find("boot")then
errData.mes[c]=l:gsub("^\t*","")
c=c+1
if LOADED then
--Generate error message
local errData={}
errData.mes={"Error:"..msg}
local c=2
for l in debug.traceback("",2):gmatch("(.-)\n")do
if c>2 then
if not l:find("boot")then
errData.mes[c]=l:gsub("^\t*","")
c=c+1
end
else
errData.mes[2]="Traceback"
c=3
end
else
errData.mes[2]="Traceback"
c=3
end
local errMes=table.concat(errData.mes,"\n",1,c-2)
DBP(errMes)
--Write messages to log file
love.filesystem.append("conf/error.log",
os.date("%Y/%m/%d %A %H:%M:%S\n")..
#ERRDATA.." crash(es) "..SYSTEM.."-"..VERSION_NAME.." scene: "..(SCN and SCN.cur or"NULL").."\n"..
errMes.."\n\n"
)
ins(ERRDATA,errData)
--Force quit if error too much
if #ERRDATA>=5 then return end
--Get screencapture
BG.set("none")
love.audio.stop()
gc.reset()
gc.captureScreenshot(function(_)errData.shot=gc.newImage(_)end)
gc.present()
--Create a new mainLoop thread to keep game alive
local status,resume=coroutine.status,coroutine.resume
local loopThread=coroutine.create(secondLoopThread)
repeat
local res,err=resume(loopThread)
if not res then
love.errorhandler(err)
return
end
until status(loopThread)=="dead"
else
ms.setVisible(true)
love.audio.stop()
local err={"Error:"..msg}
local trace=debug.traceback("",2)
local c=2
for l in trace:gmatch("(.-)\n")do
if c>2 then
if not l:find("boot")then
err[c]=l:gsub("^\t*","")
c=c+1
end
else
err[2]="Traceback"
c=3
end
end
DBP(table.concat(err,"\n"),1,c-2)
gc.reset()
gc_setColor(1,1,1)
SFX.fplay("error",SETTING and SETTING.voc*.8 or 0)
local errorMsg=text and text.errorMsg or"An error has occurred during loading.\nError info has been created, and you can send it to the author."
return function()
love.event.pump()
for E,a,b in love.event.poll()do
if E=="quit"or a=="escape"then
destroyPlayers()
return 1
elseif E=="resize"then
SCR.resize(a,b)
end
end
gc.clear(.3,.5,.9)
gc_push("transform")
gc.replaceTransform(xOy)
setFont(100)gc_print(":(",100,40,0,1.2)
setFont(40)gc.printf(errorMsg,100,200,SCR.w0-100)
setFont(20)
gc_print(SYSTEM.."-"..VERSION_NAME,100,660)
gc.printf(err[1],626,380,1260-626)
gc_print("TRACEBACK",626,450)
for i=4,#err-2 do
gc_print(err[i],626,400+20*i)
end
gc_pop()
gc_present()
love.timer.sleep(.26)
end
end
local errMes=table.concat(errData.mes,"\n",1,c-2)
DBP(errMes)
--Write messages to log file
love.filesystem.append("conf/error.log",
os.date("%Y/%m/%d %A %H:%M:%S\n")..
#ERRDATA.." crash(es) "..SYSTEM.."-"..VERSION_NAME.." scene: "..(SCN and SCN.cur or"NULL").."\n"..
errMes.."\n\n"
)
ins(ERRDATA,errData)
--Force quit if error too much
if #ERRDATA>=5 then return end
--Get screencapture
BG.set("none")
love.audio.stop()
gc.reset()
gc.captureScreenshot(function(_)errData.shot=gc.newImage(_)end)
gc.present()
--Create a new mainLoop thread to keep game alive
local status,resume=coroutine.status,coroutine.resume
local loopThread=coroutine.create(secondLoopThread)
repeat
local res,err=resume(loopThread)
if not res then
love.errorhandler(err)
return
end
until status(loopThread)=="dead"
end
local WSnames={"app","user","chat","play","stream"}
local WScolor={