Lua Errors: Difference between revisions
>GoldenUrg →Confusing Error Messages: number concat |
>GoldenUrg →Confusing Error Messages: number concat |
(No difference)
|
Revision as of 03:53, 7 May 2010
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
Wed Apr 28 21:10:21 2010 - Workspace.Script:3: 'end' expected (to close 'while' at line 1) near '<eof>'
Let's break the message down in parts:
- "Wed Apr 28 21:10:21 2010" - 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
Wed Apr 28 21:11:56 2010 - 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
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
Thu May 06 20:15:26 2010 - 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) Thu May 06 20:17:01 2010 - 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)
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 [___] | 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
Wed Apr 28 21:10:21 2010 - 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)
Wed Apr 28 21:10:30 2010 - Workspace.Script:4: '<eof>' expected near 'end'
The end on line 4 is extra.
Wed Apr 28 21:34:08 2010 - Workspace.Script:1: 'then' expected near '='
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' Wed Apr 28 21:38:42 2010 - Workspace.Script:2: unexpected symbol near 'if'
Errors on the beginning of a line are often because an incomplete previous line.
Wed Apr 28 21:36:33 2010 - Workspace.Script:3: '=' expected near '=='
This is caused by using '==' (comparison) instead of '=' assignment.
Thu May 06 20:49:19 2010 - 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" )
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.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.
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.
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.