Difference between revisions of "love.errorhandler (日本語)"

m
(Translation updated.)
 
Line 1: Line 1:
 
{{newin (日本語)|[[11.0 (日本語)|11.0]]|110|type=関数|text=この関数は [[love.errhand (日本語)|love.errhand]] から名称変更されました}}
 
{{newin (日本語)|[[11.0 (日本語)|11.0]]|110|type=関数|text=この関数は [[love.errhand (日本語)|love.errhand]] から名称変更されました}}
 
エラーメッセージの表示に使用されるエラーハンドラです。
 
エラーメッセージの表示に使用されるエラーハンドラです。
== 関連 ==
+
{{notice|注意点として、エラーハンドラ関数でエラーが発生した場合、 LÖVE は即時終了します!}}
 +
 
 +
== 関数 ==
 
=== 概要 ===
 
=== 概要 ===
 
<source lang="lua">
 
<source lang="lua">
love.errorhandler( msg )
+
mainLoop = love.errorhandler( msg )
 
</source>
 
</source>
 
=== 引数 ===
 
=== 引数 ===
 
{{param|string|msg|エラーメッセージ。}}
 
{{param|string|msg|エラーメッセージ。}}
 
=== 返値 ===
 
=== 返値 ===
ありません。
+
{{param|function|mainLoop|呼び出し時において、イベントやレンダリングの存在する単フレームを処理するための関数。これが nil の場合、 LÖVE は即時終了します。}}
 +
 
 
== 用例 ==
 
== 用例 ==
 +
=== 未指定時はデフォルトの関数を使用します。 ===
 +
{{newin (日本語)|[[11.4 (日本語)|11.4]]|110|type=異形}}
 +
<source lang="Lua">
 +
local utf8 = require("utf8")
 +
 +
local function error_printer(msg, layer)
 +
print((debug.traceback("Error: " .. tostring(msg), 1+(layer or 1)):gsub("\n[^\n]+$", "")))
 +
end
 +
 +
function love.errorhandler(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.isOpen() then
 +
local success, status = pcall(love.window.setMode, 800, 600)
 +
if not success or not status then
 +
return
 +
end
 +
end
 +
 +
-- 状態のリセット
 +
if love.mouse then
 +
love.mouse.setVisible(true)
 +
love.mouse.setGrabbed(false)
 +
love.mouse.setRelativeMode(false)
 +
if love.mouse.isCursorSupported() then
 +
love.mouse.setCursor()
 +
end
 +
end
 +
if love.joystick then
 +
-- 全てのジョイスティックの振動を停止
 +
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(14)
 +
 +
love.graphics.setColor(1, 1, 1)
 +
 +
local trace = debug.traceback()
 +
 +
love.graphics.origin()
 +
 +
local sanitizedmsg = {}
 +
for char in msg:gmatch(utf8.charpattern) do
 +
table.insert(sanitizedmsg, char)
 +
end
 +
sanitizedmsg = table.concat(sanitizedmsg)
 +
 +
local err = {}
 +
 +
table.insert(err, "Error\n")
 +
table.insert(err, sanitizedmsg)
 +
 +
if #sanitizedmsg ~= #msg then
 +
table.insert(err, "Invalid UTF-8 string in error message.")
 +
end
 +
 +
table.insert(err, "\n")
 +
 +
for l in trace:gmatch("(.-)\n") do
 +
if not l:match("boot.lua") then
 +
l = l:gsub("stack traceback:", "Traceback\n")
 +
table.insert(err, l)
 +
end
 +
end
 +
 +
local p = table.concat(err, "\n")
 +
 +
p = p:gsub("\t", "")
 +
p = p:gsub("%[string \"(.-)\"%]", "%1")
 +
 +
local function draw()
 +
if not love.graphics.isActive() then return end
 +
local pos = 70
 +
love.graphics.clear(89/255, 157/255, 220/255)
 +
love.graphics.printf(p, pos, pos, love.graphics.getWidth() - pos)
 +
love.graphics.present()
 +
end
 +
 +
local fullErrorText = p
 +
local function copyToClipboard()
 +
if not love.system then return end
 +
love.system.setClipboardText(fullErrorText)
 +
p = p .. "\nCopied to clipboard!"
 +
end
 +
 +
if love.system then
 +
p = p .. "\n\nPress Ctrl+C or tap to copy this error"
 +
end
 +
 +
return function()
 +
love.event.pump()
 +
 +
for e, a, b, c in love.event.poll() do
 +
if e == "quit" then
 +
return 1
 +
elseif e == "keypressed" and a == "escape" then
 +
return 1
 +
elseif e == "keypressed" and a == "c" and love.keyboard.isDown("lctrl", "rctrl") then
 +
copyToClipboard()
 +
elseif e == "touchpressed" then
 +
local name = love.window.getTitle()
 +
if #name == 0 or name == "Untitled" then name = "Game" end
 +
local buttons = {"OK", "Cancel"}
 +
if love.system then
 +
buttons[3] = "Copy to clipboard"
 +
end
 +
local pressed = love.window.showMessageBox("Quit "..name.."?", "", buttons)
 +
if pressed == 1 then
 +
return 1
 +
elseif pressed == 3 then
 +
copyToClipboard()
 +
end
 +
end
 +
end
 +
 +
draw()
 +
 +
if love.timer then
 +
love.timer.sleep(0.1)
 +
end
 +
end
 +
 +
end
 +
</source>
 +
----
 +
{{newinoldin (日本語)|[[11.0 (日本語)|11.0]]|110|[[11.4 (日本語)|11.4]]|114|type=異形}}
 
=== 未指定時はデフォルトの関数を使用します。 ===
 
=== 未指定時はデフォルトの関数を使用します。 ===
 
<source lang="Lua">
 
<source lang="Lua">
Line 147: Line 286:
 
== 関連 ==
 
== 関連 ==
 
* [[parent::love (日本語)]]
 
* [[parent::love (日本語)]]
 +
* [[love.run (日本語)]]
 +
 +
== そのほかの言語 ==
 +
{{i18n (日本語)|love.errorhandler}}
 +
 
[[Category:Callbacks]]
 
[[Category:Callbacks]]
 
{{#set:Description=エラーメッセージの表示に使用されるエラーハンドラです。}}
 
{{#set:Description=エラーメッセージの表示に使用されるエラーハンドラです。}}
Line 152: Line 296:
 
{{#set:Since=110}}
 
{{#set:Since=110}}
 
{{#set:PrettySince=11.0}}
 
{{#set:PrettySince=11.0}}
== そのほかの言語 ==
 
{{i18n (日本語)|love.errorhandler}}
 

Latest revision as of 12:38, 8 July 2023

LÖVE 11.0 から使用可能
この関数は love.errhand から名称変更されました。

エラーメッセージの表示に使用されるエラーハンドラです。

O.png 注意点として、エラーハンドラ関数でエラーが発生した場合、 LÖVE は即時終了します!  


関数

概要

mainLoop = love.errorhandler( msg )

引数

string msg
エラーメッセージ。

返値

function mainLoop
呼び出し時において、イベントやレンダリングの存在する単フレームを処理するための関数。これが nil の場合、 LÖVE は即時終了します。

用例

未指定時はデフォルトの関数を使用します。

LÖVE 11.4 から使用可能
この異形は以前のバージョンでは非対応です。
local utf8 = require("utf8")

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

function love.errorhandler(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.isOpen() then
		local success, status = pcall(love.window.setMode, 800, 600)
		if not success or not status then
			return
		end
	end

	-- 状態のリセット
	if love.mouse then
		love.mouse.setVisible(true)
		love.mouse.setGrabbed(false)
		love.mouse.setRelativeMode(false)
		if love.mouse.isCursorSupported() then
			love.mouse.setCursor()
		end
	end
	if love.joystick then
		-- 全てのジョイスティックの振動を停止
		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(14)

	love.graphics.setColor(1, 1, 1)

	local trace = debug.traceback()

	love.graphics.origin()

	local sanitizedmsg = {}
	for char in msg:gmatch(utf8.charpattern) do
		table.insert(sanitizedmsg, char)
	end
	sanitizedmsg = table.concat(sanitizedmsg)

	local err = {}

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

	if #sanitizedmsg ~= #msg then
		table.insert(err, "Invalid UTF-8 string in error message.")
	end

	table.insert(err, "\n")

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

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

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

	local function draw()
		if not love.graphics.isActive() then return end
		local pos = 70
		love.graphics.clear(89/255, 157/255, 220/255)
		love.graphics.printf(p, pos, pos, love.graphics.getWidth() - pos)
		love.graphics.present()
	end

	local fullErrorText = p
	local function copyToClipboard()
		if not love.system then return end
		love.system.setClipboardText(fullErrorText)
		p = p .. "\nCopied to clipboard!"
	end

	if love.system then
		p = p .. "\n\nPress Ctrl+C or tap to copy this error"
	end

	return function()
		love.event.pump()

		for e, a, b, c in love.event.poll() do
			if e == "quit" then
				return 1
			elseif e == "keypressed" and a == "escape" then
				return 1
			elseif e == "keypressed" and a == "c" and love.keyboard.isDown("lctrl", "rctrl") then
				copyToClipboard()
			elseif e == "touchpressed" then
				local name = love.window.getTitle()
				if #name == 0 or name == "Untitled" then name = "Game" end
				local buttons = {"OK", "Cancel"}
				if love.system then
					buttons[3] = "Copy to clipboard"
				end
				local pressed = love.window.showMessageBox("Quit "..name.."?", "", buttons)
				if pressed == 1 then
					return 1
				elseif pressed == 3 then
					copyToClipboard()
				end
			end
		end

		draw()

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

end

LÖVE 11.0 まで使用可能でしたが LÖVE 11.4 で廃止されました
この異形は以降のバージョンでは非対応です。

未指定時はデフォルトの関数を使用します。

local utf8 = require("utf8")

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

function love.errorhandler(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.isOpen() then
		local success, status = pcall(love.window.setMode, 800, 600)
		if not success or not status then
			return
		end
	end

	-- 状態のリセット
	if love.mouse then
		love.mouse.setVisible(true)
		love.mouse.setGrabbed(false)
		love.mouse.setRelativeMode(false)
		if love.mouse.isCursorSupported() then
			love.mouse.setCursor()
		end
	end
	if love.joystick then
		-- 全てのジョイスティックの振動を停止
		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(14)

	love.graphics.setColor(1, 1, 1, 1)

	local trace = debug.traceback()

	love.graphics.origin()

	local sanitizedmsg = {}
	for char in msg:gmatch(utf8.charpattern) do
		table.insert(sanitizedmsg, char)
	end
	sanitizedmsg = table.concat(sanitizedmsg)

	local err = {}

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

	if #sanitizedmsg ~= #msg then
		table.insert(err, "Invalid UTF-8 string in error message.")
	end

	table.insert(err, "\n")

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

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

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

	local function draw()
		local pos = 70
		love.graphics.clear(89/255, 157/255, 220/255)
		love.graphics.printf(p, pos, pos, love.graphics.getWidth() - pos)
		love.graphics.present()
	end

	local fullErrorText = p
	local function copyToClipboard()
		if not love.system then return end
		love.system.setClipboardText(fullErrorText)
		p = p .. "\nCopied to clipboard!"
		draw()
	end

	if love.system then
		p = p .. "\n\nPress Ctrl+C or tap to copy this error"
	end

	return function()
		love.event.pump()

		for e, a, b, c in love.event.poll() do
			if e == "quit" then
				return 1
			elseif e == "keypressed" and a == "escape" then
				return 1
			elseif e == "keypressed" and a == "c" and love.keyboard.isDown("lctrl", "rctrl") then
				copyToClipboard()
			elseif e == "touchpressed" then
				local name = love.window.getTitle()
				if #name == 0 or name == "Untitled" then name = "Game" end
				local buttons = {"OK", "Cancel"}
				if love.system then
					buttons[3] = "Copy to clipboard"
				end
				local pressed = love.window.showMessageBox("Quit "..name.."?", "", buttons)
				if pressed == 1 then
					return 1
				elseif pressed == 3 then
					copyToClipboard()
				end
			end
		end

		draw()

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

end

関連

そのほかの言語