Lua Errors: Difference between revisions

From Legacy Roblox Wiki
Jump to navigationJump to search
>GoldenUrg
→‎Confusing Error Messages: added new messages
m Text replacement - "</SyntaxHighlight>" to "</syntaxhighlight>"
 
(40 intermediate revisions by 8 users not shown)
Line 3: Line 3:


=== Compile Errors ===
=== Compile Errors ===
Wed Apr 28 21:10:21 2010 - Workspace.Script:3: 'end' expected (to close 'while' at line 1) near '<eof>'
{{ErrorMessage|Workspace.Script:3: 'end' expected (to close 'while' at line 1) near '<eof>'|}}


Let's break the message down in parts:
Let's break the message down in parts:
* "Wed Apr 28 21:10:21 2010" - time of the message
* "Wed Dec 09 12:34:56 2009" - time of the message
* "Workspace.Script" - [[GetFullName (Function)|Full name]] of the script
* "Workspace.Script" - [[GetFullName (Function)|Full name]] of the script
* "3" - the line with the error
* "3" - the line with the error
Line 14: Line 14:


=== Runtime Errors ===
=== Runtime Errors ===
Wed Apr 28 21:11:56 2010 - Workspace.Script:7: attempt to perform arithmetic on global 'a' (a function value)
{{ErrorMessage|Workspace.Script:7: attempt to perform arithmetic on global 'a' (a function value)|}}
  Wed Apr 28 21:11:56 2010 - Workspace.Script, line 7 - global b Workspace.Script, line 2 - global a Workspace.Script, line 14 stack end  
  Wed Dec 09 12:34:56 2009 - <font style="color:blue">Workspace.Script, line 7 - global b Workspace.Script, line 2 - global a Workspace.Script, line 14 stack end</font>


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


=== Basic Lua Errors ===
=== Basic Lua Errors ===
Thu May 06 20:15:26 2010 - Workspace.Script:2: attempt to index global 'a' (a function value)
{{ErrorMessage|Workspace.Script:2: attempt to index global 'a' (a function value)|}}
Thu May 06 20:15:55 2010 - Workspace.Script:2: attempt to perform arithmetic on local 'a' (a string value)
{{ErrorMessage|Workspace.Script:2: attempt to perform arithmetic on local 'a' (a string value)|}}
Thu May 06 20:17:01 2010 - Workspace.Script:2: attempt to concatenate upvalue 'a' (a nil value)
{{ErrorMessage|Workspace.Script:2: attempt to concatenate upvalue 'a' (a nil value)|}}
Thu May 06 20:17:03 2010 - Workspace.Script:2: attempt to call field 'a' (a number value)
{{ErrorMessage|Workspace.Script:2: attempt to call field 'a' (a number value)|}}
Many Lua "operators" give similar error messages:
Many Lua "operators" give similar error messages:
* "Workspace.Script:2:" - The source of the error
* "Workspace.Script:2:" - The source of the error
* "attempt to ___" - The error is caused by the given operation on the wrong type of variable
* "attempt to ___" - The error is caused by the given operation on the wrong type of variable
{|
{| class="wikitable"
! Operation Name !! Operator !! Allowed Types
! Operation Name !! Operator !! Allowed Types
|-
|-
| index || '''.''' ''or'' '''['''___''']''' || table, string
| index || '''.''' ''or'' '''['''k''']''' || table, string
|-
|-
| perform arithmetic || ''various'' || number, string*
| perform arithmetic || ''various'' || number, string*
Line 42: Line 42:
| concatenate || '''..''' || string, number
| concatenate || '''..''' || string, number
|-
|-
| call || '''('''___''')''' || function
| call || '''('''...''')''' || function
|}
|}
** Note: String can only be used in arithmetic if it can be converted to a number.
** Note: String can only be used in arithmetic if it can be converted to a number.
Line 51: Line 51:


== Confusing Error Messages ==
== Confusing Error Messages ==
Wed Apr 28 21:10:30 2010 - Workspace.Script:3: 'end' expected (to close 'while' at line 1) near '<eof>'
{{ErrorMessage|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:
The while on line 1 is missing an end. You need an end for each of the following:
Line 57: Line 57:
* do
* do
* if (but not elseif)
* if (but not elseif)
 
-----
Wed Apr 28 21:10:30 2010 - Workspace.Script:4: '<eof>' expected near 'end'
{{ErrorMessage|Workspace.Script:4: '<eof>' expected near 'end'|}}


The end on line 4 is extra.
The end on line 4 is extra.
 
-----
Wed Apr 28 21:34:08 2010 - Workspace.Script:1: 'then' expected near '='
{{ErrorMessage|Workspace.Script:1: 'then' expected near '&#61;'|}}


This is caused by using '=' (assignment) in an if instead of '==' (comparsion)
This is caused by using '=' (assignment) in an if instead of '==' (comparsion)
 
-----
Wed Apr 28 21:36:33 2010 - Workspace.Script:2: '=' expected near 'if'
{{ErrorMessage|Workspace.Script:2: '&#61;' expected near 'if'|}}
Wed Apr 28 21:38:42 2010 - Workspace.Script:2: unexpected symbol near 'if'
{{ErrorMessage|Workspace.Script:2: unexpected symbol near 'if'|}}
{{ErrorMessage|Workspace.Script:2: function arguments expected near 'if'|}}
Errors on the beginning of a line are often because an incomplete previous line.
Errors on the beginning of a line are often because an incomplete previous line.
 
In this case, the problems are:
Wed Apr 28 21:36:33 2010 - Workspace.Script:3: '=' expected near '=='
<syntaxhighlight lang="lua">
Game.GetService -- missing parentheses ()
Game.GetService( -- missing close parenthesis )
Game:GetService -- missing parentheses () or "function arguments"
</syntaxhighlight>
-----
{{ErrorMessage|Workspace.Script:3: '&#61;' expected near '&#61;&#61;'|}}
This is caused by using '==' (comparison) instead of '=' assignment.
This is caused by using '==' (comparison) instead of '=' assignment.
 
-----
Thu May 06 20:49:19 2010 - Workspace.Script:1: malformed number near '1..'
{{ErrorMessage|Workspace.Script:1: malformed number near '1..'|}}
This is caused by attempting to concatenate a number without putting a space since dots can be part of a number:
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" )
<syntaxhighlight lang="lua">
print( 1.." tests passed" )
</syntaxhighlight>
instead of
instead of
print( 1 .." tests passed" )
<syntaxhighlight lang="lua">
 
print( 1 .." tests passed" )
Thu May 06 20:55:43 2010 - Workspace.Script:1: bad argument #3 to '?' (Object expected, got function)
</syntaxhighlight>
-----
{{ErrorMessage|Workspace.Script:1: bad argument #3 to '?' (Object expected, got function)|}}
This error was caused by assigning the wrong type of value to a property:
This error was caused by assigning the wrong type of value to a property:
  Workspace.Part.Parent = print
  Workspace.Part.Parent = print
* Advanced Note: The message comes from the __newindex(obj,ndx,val) function in the Instance metatable.
* Advanced Note: The message comes from the __newindex(obj,ndx,val) function in the Instance metatable.
Similarly, you can get
Similarly, you can get
Thu May 06 20:59:49 2010 - Workspace.Script:1: bad argument #2 to '?' (string expected, got function)
{{ErrorMessage|Workspace.Script:1: bad argument #2 to '?' (string expected, got function)|}}
By indexing an object with the wrong type:
By indexing an object with the wrong type:
print( Workspace.Part[print] )
<syntaxhighlight lang="lua">
 
print( Workspace.Part[print] )
Thu May 06 21:02:18 2010 - Part is not a valid member of Workspace
</syntaxhighlight>
-----
{{ErrorMessage|Workspace.Script:1: bad argument #2 to '?' (Vector3 expected, got number)|}}
This error was caused by incorrect math on an Object
<syntaxhighlight lang="lua">
print( Vector3.new() + 1 )
</syntaxhighlight>
* Advanced Note: The message comes from the __add(obj,val) function in the Instance metatable.
-----
{{ErrorMessage|Part1 is not a valid member of Workspace|}}
Aside from the obvious, this message also occurs if you attempt to set a child directly:
Aside from the obvious, this message also occurs if you attempt to set a child directly:
print( Workspace.Part1 ) -- ok
<syntaxhighlight lang="lua">
Workspace.Part1 = Instance.new("Part") -- error
print( Workspace.Part1 ) -- ok
Workspace.Part1 = Instance.new("Part") -- error
</syntaxhighlight>
You need to set the Name and Parent properties instead:
You need to set the Name and Parent properties instead:
local part = Instance.new("Part")
<syntaxhighlight lang="lua">
part.Name = "Part1"
local part = Instance.new("Part")
part.Parent = Workspace
part.Name = "Part1"
part.Parent = Workspace
</syntaxhighlight>
* Advanced Note: Why does this not have a source line?
* Advanced Note: Why does this not have a source line?
-----
{{ErrorMessage|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.
-----
{{ErrorMessage|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.
== Unusual Error Messages ==
{{ErrorMessage|maximum event re-entrancy depth exceeded}}
This is caused by too many events triggering each other.
A simple example is this script:
<syntaxhighlight lang="lua">
local bv = Instance.new("BoolValue")
bv.Parent = script
bv.Value = false
bv.Changed:connect( function() bv.Value = not bv.Value end )
bv.Value = true
</syntaxhighlight>
-----
{{ErrorMessage|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:
<syntaxhighlight lang="lua">
Game:FindFirstChild(Workspace)
</syntaxhighlight>
instead of
<syntaxhighlight lang="lua">
Game:FindFirstChild("Workspace")
</syntaxhighlight>
-----
{{ErrorMessage|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]], [[Conditional_statements|if statements]], etc)
=== Local Variable Errors ===
{{ErrorMessage|main function has more than 200 local variables}}
This is due to declaring more than 200 [[Variable#Local_Variables|local variables]]. This artificial limit is put in place to prevent problems when actually running your script.
{{ErrorMessage|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|table]].
=== Ambiguous Syntax Errors ===
{{ErrorMessage|ambiguous syntax (function call x new statement) near '<some of your code>'}}
<!--Not sure if this how the error would turn out, I think it needs a line number, but I don't know how ROBLOX would handle it.!-->
When this might happen:
<syntaxhighlight lang="lua">
local value = some_function()
(another_function or some_function)(2, true, "taco")
</syntaxhighlight>
What's wrong?
Due to the way Lua handles [[Whitespace]], it thinks that the second line is an extension of the first.
Instead of seeing two separate statements, Lua sees them as one, but it's not sure whether this is right. That's because it's ''ambigious'', so it throws an error.
This can be fixed by adding a semicolon ({{`|;}}) after the first line.


== Tricky Mistakes ==
== Tricky Mistakes ==
[[Number|Floating point]] calculations can be surprising; it's safer to use inequalities. Or use an integer for controlling the loop.
[[Number|Floating point]] calculations can be surprising; it's safer to use inequalities. Or use an integer for controlling the loop.
<pre>
<syntaxhighlight lang="lua">
n = 0
n = 0
while true do
while true do
Line 106: Line 194:
   if( n == 0.9 ) then break end -- never happens
   if( n == 0.9 ) then break end -- never happens
end
end
</pre>
</syntaxhighlight>


Just like the number 1/3 would be 0.3333... (repeating) in decimal. The number 1/10 is 0.00011001100... (repeating) in binary. Exact binary values are powers of 2, like 1/2, 1/4, 1/8, 1/16 etc. And multiples of those.
Just like the number 1/3 would be 0.3333... (repeating) in decimal. The number 1/10 is 0.0<span style="text-decoration:overline;">0011</span> (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).
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).


<pre>
<syntaxhighlight lang="lua">
part.Transparency = 0.1
part.Transparency = 0.1
if( part.Transparency == 0.1 ) then -- false
if( part.Transparency == 0.1 ) then -- false
--
--
end
end
</pre>
</syntaxhighlight>


In this case, Transparency property of Roblox stores less digits than Lua uses.  
In this case, Transparency property of Roblox stores less digits than Lua uses.  
Line 125: Line 213:


When Lua compares 0.333 to 0.333333 they are not equal.
When Lua compares 0.333 to 0.333333 they are not equal.
|}}
}}
 
[[Category:Scripting_Tutorials]]

Latest revision as of 06:08, 27 April 2023

Reading Lua Error Messages

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

Compile Errors

Saturday Nov 23 23:11:56 2024 - 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
  • "3" - the line with the error
  • "'end' expected (to close 'while' at line 1) near '<eof>'" - the error message

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

Runtime Errors

Saturday Nov 23 23:11:56 2024 - 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

Saturday Nov 23 23:11:56 2024 - Workspace.Script:2: attempt to index global 'a' (a function value)
Saturday Nov 23 23:11:56 2024 - Workspace.Script:2: attempt to perform arithmetic on local 'a' (a string value)
Saturday Nov 23 23:11:56 2024 - Workspace.Script:2: attempt to concatenate upvalue 'a' (a nil value)
Saturday Nov 23 23:11:56 2024 - 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 various number, string*
concatenate .. string, number
call (...) function
    • Note: String can only be used in arithmetic if it can be converted to a number.
    • Advanced Note: Metatables can be used to allow tables or userdata perform any of these operations.
  • "___ 'a'" - The given type of a variable named 'a' (a will be the actual name in the code)
    • NOTE: that 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

Saturday Nov 23 23:11:56 2024 - 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)

Saturday Nov 23 23:11:56 2024 - Workspace.Script:4: '<eof>' expected near 'end'

The end on line 4 is extra.


Saturday Nov 23 23:11:56 2024 - Workspace.Script:1: 'then' expected near '='

This is caused by using '=' (assignment) in an if instead of '==' (comparsion)


Saturday Nov 23 23:11:56 2024 - Workspace.Script:2: '=' expected near 'if'
Saturday Nov 23 23:11:56 2024 - Workspace.Script:2: unexpected symbol near 'if'
Saturday Nov 23 23:11:56 2024 - 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"

Saturday Nov 23 23:11:56 2024 - Workspace.Script:3: '=' expected near '=='

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


Saturday Nov 23 23:11:56 2024 - Workspace.Script:1: malformed number near '1..'

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" )

Saturday Nov 23 23:11:56 2024 - Workspace.Script:1: bad argument #3 to '?' (Object expected, got function)

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

Workspace.Part.Parent = print
  • Advanced Note: The message comes from the __newindex(obj,ndx,val) function in the Instance metatable.

Similarly, you can get

Saturday Nov 23 23:11:56 2024 - Workspace.Script:1: bad argument #2 to '?' (string expected, got function)

By indexing an object with the wrong type:

print( Workspace.Part[print] )

Saturday Nov 23 23:11:56 2024 - 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.

Saturday Nov 23 23:11:56 2024 - 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?

Saturday Nov 23 23:11:56 2024 - 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.


Saturday Nov 23 23:11:56 2024 - 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.

Unusual Error Messages

Saturday Nov 23 23:11:56 2024 - maximum event re-entrancy depth exceeded

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

local bv = Instance.new("BoolValue")
bv.Parent = script
bv.Value = false

bv.Changed:connect( function() bv.Value = not bv.Value end )

bv.Value = true

Saturday Nov 23 23:11:56 2024 - 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")

Saturday Nov 23 23:11:56 2024 - 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

Saturday Nov 23 23:11:56 2024 - 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.

Saturday Nov 23 23:11:56 2024 - 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

Saturday Nov 23 23:11:56 2024 - 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. Instead of seeing two separate statements, Lua sees them as one, but it's not sure whether this is right. That's because it's ambigious, so it throws an error. This can be fixed by adding a semicolon (;) after the first line.

Tricky Mistakes

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.