# love.errhand

The error handler, used to display error messages.

## Function

### Synopsis

    love.errhand( msg )

### Arguments

`string msg`
  The error message.

### Returns

Nothing.

## Examples

Available since LÖVE 0.9.2
This variant is not supported in earlier versions.

### The default function used if you don't supply your own.

    localfunction error_printer(msg, layer)
    	print((debug.traceback("Error: " .. tostring(msg), 1+(layer or 1)):gsub("\n[^\n]+$", "")))
    end

    function love.errhand(msg)
    	msg = tostring(msg)

    	error_printer(msg, 2)

    	if not love.window or not love.graphics or not love.event then
    		return
    	end

    	if not love.graphics.isCreated() or not love.window.isCreated() then
    		local success, status = pcall(love.window.setMode, 800, 600)
    		if not success or not status then
    			return
    		end
    	end

    	-- Reset state.
    	if love.mouse then
    		love.mouse.setVisible(true)
    		love.mouse.setGrabbed(false)
    	end
    	if love.joystick then
    		-- Stop all joystick vibrations.
    		for i,v in ipairs(love.joystick.getJoysticks()) do
    			v:setVibration()
    		end
    	end
    	if love.audio then love.audio.stop() end
    	love.graphics.reset()
    	local font = love.graphics.setNewFont(math.floor(love.window.toPixels(14)))

    	local sRGB = select(3, love.window.getMode()).srgb
    	if sRGB and love.math then
    		love.graphics.setBackgroundColor(love.math.gammaToLinear(89, 157, 220))
    	else
    		love.graphics.setBackgroundColor(89, 157, 220)
    	end

    	love.graphics.setColor(255, 255, 255, 255)

    	local trace = debug.traceback()

    	love.graphics.clear()
    	love.graphics.origin()

    	local err = {}

    	table.insert(err, "Error\n")
    	table.insert(err, msg.."\n\n")

    	for l in string.gmatch(trace, "(.-)\n") do
    		if not string.match(l, "boot.lua") then
    			l = string.gsub(l, "stack traceback:", "Traceback\n")
    			table.insert(err, l)
    		end
    	end

    	local p = table.concat(err, "\n")

    	p = string.gsub(p, "\t", "")
    	p = string.gsub(p, "%[string \"(.-)\"%]", "%1")

    	local function draw()
    		local pos = love.window.toPixels(70)
    		love.graphics.clear()
    		love.graphics.printf(p, pos, pos, love.graphics.getWidth() - pos)
    		love.graphics.present()
    	end

    	while true do
    		love.event.pump()

    		for e, a, b, c in love.event.poll() do
    			if e == "quit" then
    				return
    			end
    			if e == "keypressed" and a == "escape" then
    				return
    			end
    		end

    		draw()

    		if love.timer then
    			love.timer.sleep(0.1)
    		end
    	end
    end

Available since LÖVE 0.9.0
This variant is not supported in earlier versions.

Removed in LÖVE 0.9.2
This variant is not supported in that and later versions.

### The default function used if you don't supply your own.

    localfunction error_printer(msg, layer)
    	print((debug.traceback("Error: " .. tostring(msg), 1+(layer or 1)):gsub("\n[^\n]+$", "")))
    end

    function love.errhand(msg)
    	msg = tostring(msg)

    	error_printer(msg, 2)

    	if not love.window or not love.graphics or not love.event then
    		return
    	end

    	if not love.graphics.isCreated() or not love.window.isCreated() then
    		if not pcall(love.window.setMode, 800, 600) then
    			return
    		end
    	end

    	-- Reset state.
    	if love.mouse then
    		love.mouse.setVisible(true)
    		love.mouse.setGrabbed(false)
    	end
    	if love.joystick then
    		for i,v in ipairs(love.joystick.getJoysticks()) do
    			v:setVibration() -- Stop all joystick vibrations.
    		end
    	end
    	if love.audio then love.audio.stop() end
    	love.graphics.reset()
    	love.graphics.setBackgroundColor(89, 157, 220)
    	local font = love.graphics.setNewFont(14)

    	love.graphics.setColor(255, 255, 255, 255)

    	local trace = debug.traceback()

    	love.graphics.clear()
    	love.graphics.origin()

    	local err = {}

    	table.insert(err, "Error\n")
    	table.insert(err, msg.."\n\n")

    	for l in string.gmatch(trace, "(.-)\n") do
    		if not string.match(l, "boot.lua") then
    			l = string.gsub(l, "stack traceback:", "Traceback\n")
    			table.insert(err, l)
    		end
    	end

    	local p = table.concat(err, "\n")

    	p = string.gsub(p, "\t", "")
    	p = string.gsub(p, "%[string \"(.-)\"%]", "%1")

    	local function draw()
    		love.graphics.clear()
    		love.graphics.printf(p, 70, 70, love.graphics.getWidth() - 70)
    		love.graphics.present()
    	end

    	while true do
    		love.event.pump()

    		for e, a, b, c in love.event.poll() do
    			if e == "quit" then
    				return
    			end
    			if e == "keypressed" and a == "escape" then
    				return
    			end
    		end

    		draw()

    		if love.timer then
    			love.timer.sleep(0.1)
    		end
    	end

    end

Removed in LÖVE 0.9.0
This variant is not used in that and later versions..

### The default function used if you don't supply your own.

    localfunction error_printer(msg, layer)
    	print((debug.traceback("Error: " .. tostring(msg), 1+(layer or 1)):gsub("\n[^\n]+$", "")))
    end

    function love.errhand(msg)
    	msg = tostring(msg)

    	error_printer(msg, 2)

    	if not love.graphics or not love.event or not love.graphics.isCreated() then
    		return
    	end

    	-- Load.
    	if love.audio then love.audio.stop() end
    	love.graphics.reset()
    	love.graphics.setBackgroundColor(89, 157, 220)
    	local font = love.graphics.newFont(14)
    	love.graphics.setFont(font)

    	love.graphics.setColor(255, 255, 255, 255)

    	local trace = debug.traceback()

    	love.graphics.clear()

    	local err = {}

    	table.insert(err, "Error\n")
    	table.insert(err, msg.."\n\n")

    	for l in string.gmatch(trace, "(.-)\n") do
    		if not string.match(l, "boot.lua") then
    			l = string.gsub(l, "stack traceback:", "Traceback\n")
    			table.insert(err, l)
    		end
    	end

    	local p = table.concat(err, "\n")

    	p = string.gsub(p, "\t", "")
    	p = string.gsub(p, "%[string \"(.-)\"%]", "%1")

    	local function draw()
    		love.graphics.clear()
    		love.graphics.printf(p, 70, 70, love.graphics.getWidth() - 70)
    		love.graphics.present()
    	end

    	draw()

    	local e, a, b, c
    	while true do
    		e, a, b, c = love.event.wait()

    		if e == "quit" then
    			return
    		end
    		if e == "keypressed" and a == "escape" then
    			return
    		end

    		draw()

    	end

    end

## See Also

- love

##

Category:

- Callbacks