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}} | ||
− | |||
− |
Latest revision as of 12:38, 8 July 2023
LÖVE 11.0 から使用可能 |
この関数は love.errhand から名称変更されました。 |
エラーメッセージの表示に使用されるエラーハンドラです。
注意点として、エラーハンドラ関数でエラーが発生した場合、 LÖVE は即時終了します! |
Contents
関数
概要
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
関連
そのほかの言語
Dansk –
Deutsch –
English –
Español –
Français –
Indonesia –
Italiano –
Lietuviškai –
Magyar –
Nederlands –
Polski –
Português –
Română –
Slovenský –
Suomi –
Svenska –
Türkçe –
Česky –
Ελληνικά –
Български –
Русский –
Српски –
Українська –
עברית –
ไทย –
日本語 –
正體中文 –
简体中文 –
Tiếng Việt –
한국어
詳細情報