Lua errors

(Redirected from Common Scripting Mistakes)

Reading Lua Error Messages[edit]

Most errors are shown in Output Window in Roblox Studio or Tools. Understanding them can make debugging efforts much more focused.

Compile Errors[edit]

Tuesday Jun 27 04:49:56 2017 - Workspace.Script:3: 'end' expected (to close 'while' at line 1) near '<eof>'

Let's break the message down in parts:

  • "Wed Dec 09 12:34:56 2009" - time of the message
  • "Workspace.Script" - Full name of the script (ie., which script to find the error in)
  • "3" - the line with the error
  • "'end' expected (to close 'while' at line 1) near '<eof>'" - the error message (eof stands for end of file, so 'end' is expected at the end of the script)

Important: Output window doesn't always show these errors (see Debugging)

Runtime Errors[edit]

Tuesday Jun 27 04:49:56 2017 - Workspace.Script:7: attempt to perform arithmetic on global 'a' (a function value)
Wed Dec 09 12:34:56 2009 - Workspace.Script, line 7 - global b Workspace.Script, line 2 - global a Workspace.Script, line 14 stack end

The first part is the same as a compile time error. The second part is called a stack trace.

  • "Workspace.Script, line 7" - the source of the error (inside function b)
  • "- global b Workspace.Script, line 2" - call to function b (from function a)
  • "- global a Workspace.Script, line 14" - call to function a (from main script)
  • "stack end" - end of the stack trace

Advanced note: Stack trace doesn't include calls to functions that use a tail call.

Basic Lua Errors[edit]

Tuesday Jun 27 04:49:56 2017 - Workspace.Script:2: attempt to index global 'a' (a function value)
Tuesday Jun 27 04:49:56 2017 - Workspace.Script:2: attempt to perform arithmetic on local 'a' (a string value)
Tuesday Jun 27 04:49:56 2017 - Workspace.Script:2: attempt to concatenate upvalue 'a' (a nil value)
Tuesday Jun 27 04:49:56 2017 - Workspace.Script:2: attempt to call field 'a' (a number value)

Many Lua "operators" give similar error messages:

  • "Workspace.Script:2:" - The source of the error
  • "attempt to ___" - The error is caused by the given operation on the wrong type of variable
    Operation Name Operator Allowed Types
    index . or [k] table, string
    perform arithmetic on various number, string†, table‡
    concatenate .. string, number
    call (...) function

    † String can only be used in arithmetic if it can be converted to a number.
    Metatables can be used to allow tables or userdata perform any of these operations.
    }}

  • "___ 'a'" - The given scope of a variable named 'a' (a will be the actual name in the code)
    NOTE: a field name itself can be a variable, in which case the message says '?'
  • "(a ___ value)" - Gives the actual type of the variable

Confusing Error Messages[edit]

Tuesday Jun 27 04:49:56 2017 - Workspace.Script:3: 'end' expected (to close 'while' at line 1) near '<eof>'

The while on line 1 is missing an end. You need an end for each of the following:

  • function
  • do
  • if (but not elseif)

Tuesday Jun 27 04:49:56 2017 - Workspace.Script:4: '<eof>' expected near 'end'

The end on line 4 is extra.


Tuesday Jun 27 04:49:56 2017 - Workspace.Script:1: 'then' expected near '='

This is caused by using the assignment operator (=) instead of the comparisong operator (==).


Tuesday Jun 27 04:49:56 2017 - Workspace.Script:2: '=' expected near 'if'
Tuesday Jun 27 04:49:56 2017 - Workspace.Script:2: unexpected symbol near 'if'
Tuesday Jun 27 04:49:56 2017 - Workspace.Script:2: function arguments expected near 'if'

Errors on the beginning of a line are often because an incomplete previous line. In this case, the problems are:

game.GetService -- missing parentheses ()
game.GetService( -- missing close parenthesis )
game:GetService -- missing parentheses () or "function arguments"

Tuesday Jun 27 04:49:56 2017 - Workspace.Script:3: '=' expected near '=='

This is caused by using '==' (comparison) instead of '=' assignment.



malformed number near '1..'[edit]

This is caused by attempting to concatenate a number without putting a space since dots can be part of a number:

print( 1.." tests passed" )

instead of

print( 1 .." tests passed" )

bad argument #3 to '?' (Object expected)[edit]

This error was caused by assigning the wrong type of value to a property:

workspace.Part.Parent = print

bad argument #2 to '?' (string expected)[edit]

Tuesday Jun 27 04:49:56 2017 - Workspace.Script:1: bad argument #2 to '?' (string expected, got function)

By indexing an object with the wrong type:

print(workspace.Part[print])

Tuesday Jun 27 04:49:56 2017 - Workspace.Script:1: bad argument #2 to '?' (Vector3 expected, got number)

This error was caused by incorrect math on an Object

print( Vector3.new() + 1 )
  • Advanced Note: The message comes from the __add(obj,val) function in the Instance metatable.

Tuesday Jun 27 04:49:56 2017 - Part1 is not a valid member of Workspace

Aside from the obvious, this message also occurs if you attempt to set a child directly:

print(workspace.Part1) -- ok
workspace.Part1 = Instance.new("Part") -- error

You need to set the Name and Parent properties instead:

local part = Instance.new("Part")
part.Name = "Part1"
part.Parent = workspace
  • Advanced Note: Why does this not have a source line?

Tuesday Jun 27 04:49:56 2017 - Workspace.Script:1: bad argument #1 to 'Lerp' (Vector3 expected, got userdata)

Internally, Roblox objects use the userdata type of Lua. This means we've passed the wrong kind of object to the Lerp method.


Tuesday Jun 27 04:49:56 2017 - Unknown exception

This error happens when you attempt to call a locked method, use a locked event, or change a locked property. This means that you're trying to use something that Roblox does not want you to use for security reasons.


Tuesday Jun 27 04:49:56 2017 - Game script timeout

This error occurs when a script in your game runs for too long without waiting. It can be fixed by adding a call to wait to force it to yield between operations.

Unusual Error Messages[edit]

Tuesday Jun 27 04:49:56 2017 - maximum event re-entrancy depth exceeded

This is caused by too many events triggering each other. A simple example is this script:

local boolValue = Instance.new("BoolValue")
boolValue.Changed:connect(function() boolValue.Value = not boolValue.Value end )
boolValue.Value = true

Tuesday Jun 27 04:49:56 2017 - attempt to call a nil value

This message is not unusual in itself, except that it does not tell you where the error is, which is extremely frustrating.

This message is caused when ROBLOX expects a function and you send it nil.

For example, if you spell something wrong in an event connector, you can cause this error. This can be especially frustrating because it will only error when the event fires.
function touch(hit)
--(code)
end
script.Parent.Touched:connect(touched)

Note that 'touched' is the name given to the event connection, while the function is named 'touch'. This will cause the error when a part touches the script's parent.

Another example:

Spawn() -- Lua expects a function, you gave it nil.

The problem here, is that with all of these, ROBLOX creates a new thread, so the stack trace traces back to ... nothing!


Tuesday Jun 27 04:49:56 2017 - Unable to cast value to std::string

This is a C++ error from the underlying Roblox function. They may have skipped the Lua type check for performance.

Most common reason for this is passing nil or other Lua type to method expecting a string:

game:FindFirstChild(workspace)

instead of

game:FindFirstChild("Workspace")

Tuesday Jun 27 04:49:56 2017 - chunk has too many syntax levels

This is caused by doing too many operations at once.

It can result from:

  • Too many operations (e.g. Doing 500 concatenations in a single expression)
  • Too many nested control statements (Loops, if statements, etc)

Local Variable Errors[edit]

Tuesday Jun 27 04:49:56 2017 - main function has more than 200 local variables

This is due to declaring more than 200 local variables. This artificial limit is put in place to prevent problems when actually running your script.

Tuesday Jun 27 04:49:56 2017 - function at line <number> has more than 60 upvalues

Like the above error, this one is artificial. Again, it has to do with maintaining your Lua script's state while executing it.

If you encounter either this error or the one above, you should look into grouping some of your variables into at least one localized table.

Ambiguous Syntax Errors[edit]

Tuesday Jun 27 04:49:56 2017 - ambiguous syntax (function call x new statement) near '<some of your code>'

When this might happen:

local value = some_function()
(another_function or some_function)(2, true, "taco")

What's wrong?

Due to the way Lua handles Whitespace, it thinks that the second line is an extension of the first (it assumes that some_function() returns a function, and that the next set of parenthesis mark arguments). This line is ambiguous, it can read it as two separate statements or as one, but which is right isn't clear, so it throws an error. This can be fixed by adding a semicolon (;) after the first line.

Tricky Mistakes[edit]

Floating point calculations can be surprising; it's safer to use inequalities. Or use an integer for controlling the loop.

n = 0
while true do
  n = n + 0.1
  if n == 0.9 then break end -- never happens
end

Just like the number 1/3 would be 0.3333... (repeating) in decimal. The number 1/10 is 0.00011 (repeating) in binary. Exact binary values are powers of 2, like 1/2, 1/4, 1/8, 1/16 etc. And multiples of those.

Since a computer must stop at a certain number of digits, the (repeating) idea is lost. If you add up 3 * 1/3, you get 0.999 instead of 1 or 10 * 1/10 in the computer is very close to 1 but not exactly. (In fact, it's so close to 1 that if you print it, it will say "1", but if you compare it with == or subtract it from one you'll see a slight difference).

part.Transparency = 0.1
if part.Transparency == 0.1 then -- false
--
end

In this case, Transparency property of Roblox stores less digits than Lua uses.

Example

Lua says 1/3 is 0.333333, but Transparency only holds 3 digits so it is set to 0.333.

When Lua compares 0.333 to 0.333333 they are not equal.