1.8 KiB
Feature name
Summary
Allow xpcall
error handlers to yield.
Motivation
Lua 5.2+ xpcall
can yield both the main function and error handlers. Luau can only yield the main function but not the error handler.
The Luau website says that xpcall
yielding semantics have been ported from Lua 5.2. However, this isn't exactly correct, only the main function can yield, such an oversight can lead to potential confusion with users. This also adds a layer of incompatibility with vanilla Lua that's not needed.
The biggest issue is that the yield semantics are very un-intuitive, causing potential issues with novice users. Especially when the debug semantics aren't very user-friendly.
Furthermore, if one were to use a feature that would require yielding in the error handler, they would have to implement some kind of event wrapped functionality to be able to use the desired feature or use a different alternative to xpcall
altogether.
Design
Allow the second argument of xpcall
, which is the error handler function to yield.
Drawbacks
Potential performance implications and increased complexity in call semantic handling. Probably very minor though.
Alternatives
One alternative to this is to use promises. Many users however prefer the vanilla pcall
and xpcall
functions for a variety of reasons.
Another alternative is to define a yxpcall
function like so:
local function yxpcall(f, callback, ...)
local args = table.pack(pcall(f, ...))
if not args[1] then
callback(args[2])
else
return table.unpack(args, 2)
end
end
Having to define a specific yxpcall
function just to allow a function to yield but having otherwise identical semantics feels cumbersome and frankly smells of the design stupidity of the deprecated ypcall
function and most novice users may not be experienced enough to even pinpoint the source of the issue.